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?
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:
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.
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 Authorization
baş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.
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.
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ı:
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.
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.