JWT çalınırsa ne olur?


203

RESTful API'lerim için JWT ile durum bilgisi olmayan kimlik doğrulaması uygulamaya çalışıyorum.

AFAIK, JWT temelde bir REST çağrısı sırasında HTTP üstbilgileri olarak iletilen şifreli bir dizedir.

Peki ya isteği gören ve jetonu çalan bir kulak misafiri varsa ne olur ? O zaman kimliğimle sahte talepte bulunabilecek mi?

Aslında, bu endişe tüm jeton tabanlı kimlik doğrulaması için geçerlidir .

Bunu nasıl önleyebilirim? HTTPS gibi güvenli bir kanal mı?


1
Jetonlar genellikle sadece kısa bir süre için geçerlidir. Ve evet, verilerinizin gizliliği konusunda endişeleriniz varsa HTTPS kullanmalısınız.
Jonathon Reinhart

4
@JonathonReinhart Ama yakında bir jetonun süresi dolarsa, müşterimin zaman zaman kendini yeniden doğrulayarak yeni bir jeton alması gerekir. Biraz sıkıcı değil mi?
smwikipedia

@JonathonReinhart Bence jetonun neden kısa ömürlü olduğunu düşünüyorum. Bu nedenle, sunucunun bir belirtecin sona ermesini takip etmesi ve böylece ölçeklenebilirliğe yol açması gerekmez. Bu tür a var trade-offarasına having finer control of token expirationve having better scalability.
smwikipedia

2
Bu da yardımcı olabilir mi? - "Jeton hırsızlığını tespit etmek için yaygın bir güvenlik mekanizması, istek IP adresi kökenlerini takip etmektir." - burada son bölümde ayrıntılı olarak açıklanmıştır - firebase.google.com/docs/auth/admin/manage-sessions
Ula

3
Teorik olarak, token hırsızlığını önlemek imkansızdır. Yapabileceğimiz en iyi şey bunun olduğunu tespit etmek ve ardından ASAP oturumunu iptal etmektir. Algılamanın en iyi yöntemi, dönen yenileme belirteçlerini kullanmaktır (RFC 6819 tarafından önerildiği gibi). İşte bunu ayrıntılı olarak açıklayan bir blog: supertokens.io/blog/…
Rishabh Poddar

Yanıtlar:


287

Kimlik doğrulamayı oldukça derinlemesine işleyen bir düğüm kütüphanesinin yazarıyım , ekspres fırtına , bu yüzden burada bazı bilgilerle karşılaşacağım.

Öncelikle, JWTS tipik olan DEĞİL şifreli. JWT'leri şifrelemenin bir yolu olsa da (bkz: JWE'ler ), uygulamada birçok nedenden dolayı çok yaygın değildir.

Şimdi, herhangi bir kimlik doğrulama biçimi (JWT kullanarak veya kullanmadan), MitM saldırılarına (ortadaki adam) saldırılara tabidir. Bu saldırılar, bir saldırgan siz internet üzerinden istekte bulunurken AĞ trafiğinizi GÖSTERABİLİR. İSS'nizin görebileceği bu, NSA vb.

SSL aşağıdakileri önlemeye yardımcı olur: NETWORK trafiğinizi bilgisayarınızdan şifreleyerek -> kimlik doğrulaması yaparken bir sunucu, ağ trafiğinizi izleyen bir üçüncü taraf, bir şekilde sunucunun özel SSL anahtarının bir kopyasını almak için (olası değil). SSL'nin tüm kimlik doğrulama formları için ZORUNLU olmasının nedeni budur.

En Ancak, birinin SSL istifade edebilir ve görmek mümkün olduğu, diyelim sizin jetonu: Sorunuzun cevabı olmasıdır EVET , saldırganın olacak sunucunuza sizi ve marka istekleri taklit o belirteç kullanabilecektir.

Şimdi protokoller devreye giriyor.

JWT'ler bir kimlik doğrulama belirteci için yalnızca bir standarttır. Hemen hemen her şey için kullanılabilirler. JWT'lerin biraz havalı olmasının nedeni, onlara fazladan bilgi ekleyebilmeniz ve kimsenin onunla uğraşmadığını (imzalama) doğrulayabilmenizdir.

ANCAK, JWT'lerin kendilerinin 'güvenlik' ile hiçbir ilgisi yoktur. Tüm niyet ve amaçlar için, JWT'ler aşağı yukarı API anahtarlarıyla aynı şeydir: bir yerlerde bazı sunuculara kimlik doğrulaması yapmak için kullandığınız rastgele dizeler.

Sorunuzu daha ilginç kılan şey kullanılan protokoldür (büyük olasılıkla OAuth2).

OAuth2'nin çalışma şekli, istemcilere SADECE KISA SÜRELİ bir dönem için kimlik doğrulaması için GEÇİCİ jetonlar (JWT'ler gibi!) Vermek üzere tasarlanmış olmasıdır!

Fikir şu ki, jetonunuz çalınırsa, saldırgan sadece kısa bir süre için kullanabilir.

OAuth2 ile, kullanıcı adınızı / şifrenizi VEYA API kimlik bilgilerinizi vererek ve ardından karşılığında bir jeton alarak kendinizi sık sık sunucu ile yeniden doğrulamanız gerekir.

Bu süreç zaman zaman gerçekleştiği için, jetonlarınız sık sık değişecek, bu da saldırganların büyük bir sorun yaşamadan sizi sürekli taklit etmelerini zorlaştıracaktır.

Umarım bu yardımcı olur ^^


3
Aşağıdaki makalenin yazarı, JWT'nin bir dezavantajının çalınan bir JWT'den kurtulmanın tek yolunun yeni bir anahtar çifti oluşturmak ve tüm kullanıcıları etkili bir şekilde oturumu kapatmak olduğunu iddia eder. Bir DB'de depolanan oturum kimlikleriyle, web sitesi yalnızca etkilenen kullanıcının oturumlarını silebilir ve tüm cihazlardan çıkış yapabilir. OAuth2'nin buradaki resme nasıl uyduğundan veya sunulan dezavantajları azaltmaya yardımcı olup olmadığından emin değilim. medium.com/@rahulgolwalkar/…
Marcel

5
Yazar yanlış. Jetonları geçersiz kılmak için kullanabileceğiniz farklı tasarım desenleri vardır. Ancak genel olarak: herhangi bir kimlik doğrulama amacı için bir JWT kullanmak kötü bir fikirdir. Kriptografik olarak imzalanmış bir oturum fikri içeren bir oturum çerezi kullanmak çok daha etkilidir.
rdegges

1
@ rdegges lütfen JWT'nin kimlik doğrulama için nasıl kötü bir fikir olduğunu söyle? ve yukarıdaki yorumda bahsettiğiniz oturum çerezini nasıl kullanabilirim?
noman tufail

6
Bu, tek bir yanıt yazmak için çok uzun. Daha fazla bilgi edinmek isterseniz, konu hakkında detaylı bir konuşma yaptım. Slaytlarımı çevrimiçi kontrol edebilirsiniz: speakerdeck.com/rdegges/jwts-suck-and-are-stupid
rdegges

2
Teorik olarak, token hırsızlığını önlemek imkansızdır. Yapabileceğimiz en iyi şey bunun olduğunu tespit etmek ve ardından ASAP oturumunu iptal etmektir. Algılamanın en iyi yöntemi, dönen yenileme belirteçlerini kullanmaktır (RFC 6819 tarafından önerildiği gibi). İşte bunu ayrıntılı olarak açıklayan bir blog: supertokens.io/blog/…
Rishabh Poddar

31

Biliyorum bu eski bir soru ama sanırım buraya 0,50 dolarımı düşürebilirim, muhtemelen birisi yaklaşımımı tamamen reddetmek için bir argüman geliştirebilir ya da tartışabilir. HTTPS (ofc) üzerinde RESTful API JWTs kullanıyorum.

Bunun çalışması için, her zaman kısa ömürlü jetonlar yayınlamalısınız (çoğu duruma bağlı olarak, uygulamamda aslında expiddiayı 30 dakikaya ve ttl3 güne ayarlıyorum , böylece bu jetonu ttlhala olduğu sürece yenileyebilirsiniz. geçerli ve jeton kara listeye alınmadı )

İçin authentication service, invalidate jeton amacıyla, bir bellek içi önbellek tabakasını (kullanmak ister Redis bir şekilde benim durumumda) JWT blacklist/ ' ban-list(Ben RESTful felsefeyi kırar biliyorum ama saklanan belgeler şunlardır: Bazı kriterler bağlı olarak ön Kalan yaşam süreleri için kara listeye aldığım için gerçekten kısa ömürlü - ttliddia-)

Not: kara listeye alınan jetonlar otomatik olarak yenilenemez

  • Eğer user.passwordyoksa user.email(şifre onayı gerektirir), yetkilendirme servis önceki proje (ler) bir tazelenmiş belirteç ve Geçersiz Kılmaktadır (kara liste) döndürür güncellendi, böylece istemci algılar kullanıcının kimlik şekilde tehlikeye düştüğünü, onun şifresini değiştirmek için bu kullanıcıyı sorabilirsiniz eğer . Bunun için kara listeyi kullanmak istemiyorsanız, (ancak gönderildiği iatzaman) user.updated_atalanla ilgili (yayınlandığı tarih) talebini doğrulayabilirsiniz (o jwt.iat < user.updated_atzaman JWT geçerli değilse).
  • Kullanıcı kasten çıkış yaptı.

Son olarak, jetonu herkes gibi normal olarak doğrularsınız.

Not 2: önbelleğin anahtarı olarak belirtecin kendisini (gerçekten uzun) kullanmak yerine, jtitalep için bir UUID belirteci oluşturmanızı ve kullanmanızı öneririm . Hangi iyi ve ben (sadece aklıma geldi beri emin değilim) , onunla bir secure/ non-http-onlyçerez döndürerek ve X-XSRF-TOKENjs kullanarak başlığı düzgün uygulayarak, aynı UUID CSRF jetonu olarak da kullanabilirsiniz . Bu şekilde, CSRF denetimleri için başka bir belirteç oluşturma işleminin yapılmasını önlersiniz.


9
Fikrinize katkıda bulunmak için asla geç değildir. Cevabın için teşekkürler.
smwikipedia

2
Her istek için kontrol edilmesi gereken bir kara listeyi sunucuda depolarsanız, neden basit eski oturumu kullanmıyorsunuz?
Franklin Yu

@FranklinYu Kara liste, tam oturum deposundan çok daha ucuzdur. Kısa ömürlü anahtar / değer nesnelerini sakladığınız için (kalan ömür sürelerine bağlı olarak, bu oldukça kısa olmalıdır) ve bu sadece çıkış eylemleri ve belirteçleri geçersiz kılan bu tür eylemler için gerçekleşir, bu nedenle her belirteç saklanan ofc.
Frondor

2
Ne kadar ucuz olabilir? Her şeyden önce, hala sunucu tarafında bir şey saklıyorsanız, JWT tarafından talep edilen “ölçeklenebilirlik” avantajından yararlanamazsınız, çünkü hala bir şey yapmadan önce tüm uygulama sunucusunun konuşması gereken merkezi bir kara liste sunucusu vardır. Hızlı sona erme nedeniyle yalnızca 1k kara listeyi saklamanız gerekiyorsa, aynı işlemi oturumlar için de yapabilirsiniz ve bu nedenle yalnızca 1k oturum saklamanız gerekir.
Franklin Yu

3
Bu yaklaşımı seviyorum. Aslında her istekte kara listeyi kontrol etmek zorunda değilsiniz, sadece JWT süresi dolduktan sonra (jetonun kendisinden okuyabilirsiniz) ve sonraki TTL dönemine kadar olan bir istek üzerine kontrol etmek zorunda değilsiniz. "Standart" bir kullanım durumunda, bu, en çok, belirli bir belirtecin ömrü boyunca bir kez gerçekleşmelidir. Yenilendikten sonra, gelecekteki yenileme taleplerinizi reddedebilirsiniz. Teşekkürler @Frondor
John Ackerman

7

Üzgünüm, bu konuda biraz geç kaldım, ama benzer endişeler vardı ve şimdi aynı şeyde bir katkıda bulunmak istiyorum.

1) rdegges mükemmel bir nokta ekledi, JWT "güvenlik" ile ilgisi yoktur ve herhangi biri yük ile karışıklık ya da değil (imzalama) varsa, sadece doğrular; SSL, ihlallerin önlenmesine yardımcı olur.

2) Şimdi, eğer ssl de bir şekilde tehlikeye atılırsa, herhangi bir kulak misafiri taşıyıcı jetonumuzu (JWT) çalabilir ve gerçek kullanıcıyı taklit edebilir, yapılabilecek bir sonraki seviye adım , JWT'nin "mülkiyet kanıtı" nı istemciden aramaktır. .

3) Şimdi, bu yaklaşımla, JWT'nin sunucusu, alıcının isteğin aynı gerçek kullanıcıdan olup olmadığını kriptografik olarak doğrulayabileceği belirli bir Sahip Olma Kanıtı (POP) anahtarına sahiptir .

Bunun için Pozlama Kanıtı makalesine atıfta bulunmuştum ve takdirle ikna oldum.

Bir şey katkıda bulunabilsem çok mutlu olurum.

Şerefe (y)


0

Bu JWT jetonunu istemin bir parçası olarak oluşturmak isteyen ilk ana bilgisayarın ipini ekleyemez miyiz? Şimdi, JWT çalındığında ve farklı bir makineden kullanıldığında, sunucu bu belirteci doğruladığında, istenen makine ipinin istemin bir parçası olan set ile eşleşip eşleşmediğini doğrulayabiliriz. Bu eşleşmez ve bu nedenle jeton reddedilebilir. Ayrıca, kullanıcı kendi ipini jetona ayarlayarak jetonu değiştirmeye çalışırsa, jeton değiştirildikçe jeton reddedilir.


Bu olası bir çözümdür, ancak bir güvenlik duvarının arkasındaki istemciler için, bir IP adresinin bir adres havuzundan seçilmesi ve herhangi bir zamanda değişmesi tipiktir.
SpeedOfSpin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.