Kimlik doğrulama: JWT kullanımı ile oturum karşılaştırması


123

Kimlik doğrulama gibi durumlarda oturumlara göre JWT kullanmanın avantajı nedir?

Bağımsız bir yaklaşım olarak mı yoksa oturumda mı kullanılıyor?

Yanıtlar:


213

JWT'nin her söz için "oturumları" kullanmaya göre bir avantajı yoktur. JWT'ler sunucu üzerinde yapmak yerine istemcide oturum durumunu sürdürmek için bir yol sağlar.

İnsanlar bunu sorarken genellikle şunu kastediyor: " Sunucu tarafı oturumları kullanmak yerine JWT kullanmanın faydaları nelerdir? "

Sunucu taraflı oturumlarda, oturum tanımlayıcısını bir veritabanında saklamanız veya bellekte tutmanız ve istemcinin her zaman aynı sunucuya ulaştığından emin olmanız gerekir. Her ikisinin de dezavantajları var. Veritabanı (veya başka bir merkezi depolama) söz konusu olduğunda, bu bir darboğaz haline gelir ve sürdürülmesi gereken bir şeydir - esasen her talepte yapılacak ekstra bir sorgu.

Bellek içi bir çözümle yatay ölçeklendirmenizi sınırlarsınız ve oturumlar ağ sorunlarından etkilenir (Wifi ve mobil veri arasında dolaşan istemciler, sunucuların yeniden başlatılması vb.)

Oturumu istemciye taşımak, sunucu tarafı oturuma olan bağımlılığı ortadan kaldırmanız anlamına gelir, ancak kendi zorluklarını da getirir.

  • Jetonun güvenli bir şekilde saklanması
  • güvenli bir şekilde taşımak
  • JWT Oturumları bazen geçersiz kılmak zor olabilir.
  • Müşterinin iddiasına güvenmek.

Bu sorunlar JWT'ler ve diğer istemci tarafı oturum mekanizmaları tarafından paylaşılır.

JWT özellikle bunlardan sonuncusuna değinir. Bir JWT'nin ne olduğunu anlamanıza yardımcı olabilir:

Bu biraz bilgi. Kullanıcı oturumları için kullanıcı adını ve jetonun süresinin dolduğu zamanı ekleyebilirsiniz. Ancak herhangi bir şey olabilir, hatta oturum kimliği veya kullanıcının profilinin tamamı bile olabilir. (Lütfen bunu yapmayın) Kötü niyetli kişilerin sahte belirteçler oluşturmasını önleyen güvenli bir imzası vardır (Bunları imzalamak için sunucunun özel anahtarına erişmeniz gerekir ve imzalandıktan sonra değiştirilmediğini doğrulayabilirsiniz) tıpkı bir çerez veya AuthorizationÜstbilginin gönderileceği gibi, her istekte onlara gönderin . Aslında, genellikle HTTP Authorizationbaşlığında gönderilirler, ancak bir çerez kullanmak da iyidir.

Belirteç imzalanır ve böylece sunucu kaynağını doğrulayabilir. Sunucunun güvenli bir şekilde oturum açma yeteneğine güvendiğini varsayacağız (standart bir kitaplık kullanmalısınız: bunu kendiniz yapmaya çalışmayın ve sunucuyu doğru şekilde güvenli hale getirin)

Jetonun güvenli bir şekilde taşınması sorununda cevap genellikle onu şifreli bir kanal, genellikle httpS aracılığıyla göndermektir.

Jetonu istemcide güvenli bir şekilde saklamakla ilgili olarak, kötü adamların ona ulaşamayacağından emin olmanız gerekir. Bu (çoğunlukla), JS'nin kötü web sitelerinin jetonu onlara geri göndermek için okumasını engellemek anlamına gelir. Bu, diğer XSS saldırılarını hafifletmek için kullanılan stratejilerin aynısı kullanılarak hafifletilir.

JWT'leri geçersiz kılmanız gerekiyorsa, bunu başarmanın kesinlikle yolları vardır. Yalnızca "diğer oturumlarının sonlandırılmasını" talep eden kullanıcılar için kullanıcı başına bir dönemi saklamak, muhtemelen yeterince iyi olacak çok etkili bir yöntemdir. Bir uygulamanın oturum başına geçersiz kılma ihtiyacı varsa, o zaman bir oturum kimliği aynı şekilde korunabilir ve "öldürülen belirteçler" tablosu, tam kullanıcı tablosundan çok daha küçük olacak şekilde korunabilir (Yalnızca daha yeni kayıtları tutmanız gerekir. En uzun izin verilen belirteç ömrü.) Dolayısıyla belirteci geçersiz kılma yeteneği, istemci tarafı oturumlarının yararını kısmen ortadan kaldırır, çünkü bu oturumun kapatılmış durumunu sürdürmeniz gerekir. Bu, büyük olasılıkla orijinal oturum durumu tablosundan çok daha küçük bir tablo olacaktır, bu nedenle aramalar yine de daha etkilidir.

JWT belirteçlerini kullanmanın bir diğer yararı, muhtemelen sahip olmayı bekleyebileceğiniz her dilde mevcut olan kitaplıkları kullanarak uygulamanın makul derecede kolay olmasıdır. Ayrıca, başlangıçtaki kullanıcı kimlik doğrulama planınızdan tamamen ayrılmıştır - parmak izi tabanlı bir sisteme geçerseniz, oturum yönetimi şemasında herhangi bir değişiklik yapmanız gerekmez.

Daha incelikli bir fayda: JWT "bilgi" taşıyabildiğinden ve buna müşteri tarafından erişilebildiğinden, şimdi bazı akıllı şeyler yapmaya başlayabilirsiniz. Örneğin, kullanıcıya oturumunun sona ermesinden birkaç gün önce sona ereceğini hatırlatın, bu da onlara jetondaki son kullanma tarihine göre yeniden kimlik doğrulama seçeneği sunun. Ne hayal edersen.

Kısacası: JWT'ler diğer oturum tekniklerinin bazı sorularına ve eksikliklerine cevap verir.

  1. "Daha ucuz" kimlik doğrulama, bir DB gidiş-dönüşünü ortadan kaldırabileceğiniz için (veya en azından sorgulamak için çok daha küçük bir tabloya sahip olabilirsiniz!), Bu da sırayla yatay ölçeklenebilirliği mümkün kılar.
  2. Kurcalanmaya dayanıklı istemci tarafı iddiaları.

JWT'ler güvenli depolama veya taşıma gibi diğer sorunlara yanıt vermezken, herhangi bir yeni güvenlik sorunu ortaya çıkarmaz.

JWT'lerin etrafında çok fazla olumsuzluk var, ancak diğer kimlik doğrulama türleri için uyguladığınızla aynı güvenliği uygularsanız, iyi olacaksınız.

Son bir not: Bu aynı zamanda Çerezler vs Belirteçler değildir. Çerezler, bilgi bitlerini depolamak ve taşımak için bir mekanizmadır ve JWT belirteçlerini depolamak ve taşımak için de kullanılabilir.


4
Sunucu tarafı oturumlarının da sunucuda herhangi bir bilgi depolaması gerekmediğini belirtmek gerekir. Sunucu, istemciyi JWT'nin yaptığı gibi mağaza olarak kullanabilir. Gerçek fark, 1) değeri bir çerez başlığı dışında istek başlığı olarak ileterek tarayıcı güvenlik kurallarından kaçınmak ve 2) JWT ile standartlaştırılmış bir biçime sahip olmaktır.
Xeoncross

1
Yerel depoda bir jwt saklamanın güvenli olduğunu söyleyebilir misiniz? Değilse, kullanıcının oturum açmış kalması için onu kaydetmek için güvenli bir yer neresidir?
Jessica

1
Evet, yerel depolama genellikle istemci tarafında saklamak için en doğru yerdir. XSS ile ilgilenmeniz gerekiyor - Ben bir web programlama uzmanı değilim, ancak Bu Cevap stackoverflow.com/a/40376819/1810447'ye bakın ve "
XSS'ye

1
Yorumunuzda önbellek tabanlı çözüm + oturum belirteci hakkında konuşmuyorsunuz. Bana JWT + "öldürülen belirteçler" tablosundan "daha iyi" geliyor, çünkü bu "öldürülmüş belirteçler" tablosuyla, yine de oturumlar + önbellek (aynı zamanda küçük) ile sahip olacağınız bir DB erişimine ihtiyacınız var. Ve sürekli JWT'yi uygulamak, devam eden oturumlardan daha zahmetlidir, çünkü bir yenileme_token ile oynamanız gerekir (yani sürdürmek için iki jeton) ... Herhangi bir yorum gerçekten takdir edilecektir ... özellikle JWT + 'nın nasıl olduğunu gösterecek bir miktarınız varsa kill_table, oturumlar + önbellekten daha etkilidir ;-)
tobiasBora

2
@TheTahaan localStorage'ın JWT'leri saklaması önerilmez. Paylaştığınız bağlantı da bundan bahsediyor. Bu blog , JWT'nin neden localStorage'da depolanmaması gerektiğine dair iyi bir açıklamaya sahiptir.
Harke

40

Kısa cevap: Yok.

Daha uzun versiyon:

GraphQL belgelerinde bu öneriyi okuduktan sonra oturum yönetimi için JWT'leri uyguladım :

Bu kimlik doğrulama mekanizmalarından herhangi birine aşina değilseniz, express-jwt'yi kullanmanızı öneririz çünkü gelecekteki esneklikten ödün vermeden basittir.

Uygulama, sadece biraz karmaşıklık kattığı için gerçekten basitti. Ancak bir süre sonra ben (senin gibi) faydaların ne olduğunu merak etmeye başladım. Bu blog yazısı ayrıntılı olarak açıklandığı gibi, oturum yönetimi konusunda JWT için çok az sayıda (veya muhtemelen hiç yok) olduğu ortaya çıktı:

Oturumlar için JWT'yi kullanmayı bırakın


0

Yolda joepie91'in ünlü blog yazısına biraz zıtlık ekleyen iki sentim.

Düşünüldüğünde günümüz (ve yarının) uygulamaları (çoğunlukla) olan yerli bulut
ekonomik bir fayda var Vatansız JWT Kimlik uygulama ölçekleri olarak ölçekler,:
Bulut uygulamaları maliyet yaratacağını birlikte her nefes bir çizer .
Kullanıcıların artık bir oturum deposuna "karşı" kimlik doğrulaması yapmaları gerekmediğinde bu maliyet azalır.

İşleme
Bir oturum mağazasını 7/24 çalıştırmanın maliyeti vardır.
Bölmeler geçici olduğu için K8S dünyasında bellek tabanlı çözümlerden kurtulamazsınız.
Sabit oturumlar aynı nedenden dolayı iyi gitmeyecektir.

Depolama
Verilerin depolanması maliyetlidir. Verileri bir SSD'de depolamanın maliyeti daha da fazladır.
Oturumla ilgili işlemlerin hızlı bir şekilde çözülmesi gerekir, bu nedenle optik sürücü bir seçenek değildir.

G / Ç
Bazı bulut sağlayıcıları, Disk ile ilgili G / Ç için ücret alır.

Bant Genişliği
Bazı bulut sağlayıcıları, sunucu örnekleri arasındaki ağ etkinliği için ücret alır.
Bu, API ve oturum deposunun ayrı örnekler olduğu neredeyse kesin olduğundan geçerlidir.

Oturum deposunu kümeleme
Maliyet, yukarıda belirtilen tüm maliyetleri daha da artırır.


"Bölmeler geçici olduğu için K8S dünyasında bellek tabanlı çözümlerden kurtulamazsınız" Bununla ne demek istediğinizden emin değilim. Redis kesinlikle bir K8S ortamında çalışıyor ve bir redis bölmesinin kullanıcılarınızı etkilemeye yetecek kadar sık ​​başarısız olması pek olası görünmüyor.
sessiz yarışma

@quietContest Kişisel olarak yazılım geliştirirken olasılıkla uğraşmamayı tercih ediyorum. BTW, çözüm kararlılığı bir yana, bir saldırı, yazılımın başarısız olmasına ve bölmelerin yeniden başlamasına neden olarak oturum kaybına neden olabilir. Bu nedenle JWT tabanlı bir çözümü tercih ederdim.
Eyal Perry

1
"Kişisel olarak yazılım geliştirirken olasılıkla uğraşmamayı tercih ederim". Bence hepimiz bunu tercih edeceğiz, bu yüzden bellek içi veri depolarına dayanan sistemler asla başarısız olmamalıyız, çünkü bunun olasılığı oldukça yüksek görünüyor. Diğer noktaya gelince, redis örneğinizi sürekli olarak kapatabilen bir saldırganınız varsa, bunun çözümü muhtemelen JWT'leri kullanmak zorunda değildir.
quietContest

@quietContest sürekli ya da ömür boyu bir kez olay bu açıdan benim için aynı. yani, iyi yerleştirilmiş bir DDoS saldırısı, sunucunun "kullanıcıların oturumunu kapatmasına" neden olabilir. Bu, yazılımın güvenilirlik itibarı için iyi sonuç vermez. Zaten redis'in oturum yönetimi için aşırı olduğunu düşünüyorum. Maliyetlidir ve ölçeklendirilmesi gerekir, oysa (güvenli bir şekilde) bir JWT'yi bir çerezde depolamak değildir.
Eyal Perry

1
@quietContest girdiniz için teşekkürler, tartışmayı sevin!
Eyal Perry

0

Kullanıcı kimlik doğrulaması için JWT ve belirteç + önbellek arasında seçim yapma konusunda benzer bir sorum vardı.

Bu makaleleri okuduktan sonra, JWT'nin vaat ettiği faydaların, getirdiği sorunları geride bırakmadığı bana açık. Bu yüzden belirteç + önbellek (Redis / Memcached) benim için gitmenin yolu.

Yetkilendirme Başlıkları, JWT ve Oturumlar - API'ler için Doğru Kimlik Doğrulama Tekniği Nasıl Seçilir?

API'ler için Kimlik Doğrulama Teknikleri

Oturumlar için jwt kullanmayı bırakın

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.