2017-03-13 66 views
8

Spring Boot, Spring Security, OAUTH2 ve JWT ile auth jetonları olarak temel bir kimlik doğrulama sistemi uyguladık. Tamam çalışıyor ancak JWT'yi bir veritabanında depolamanın mantıklı olup olmadığını ve birisinin onu kullanarak kimliği doğrulanmış bir istekte bulunulduğunda bir belirteç olup olmadığını kontrol edip etmediğimi düşünüyordum. Özellikle aşağıdaki senaryoyu düşünüyordum: kullanıcı bir mobil cihazda doğrulanır ve onu kaybeder, böylece bu cihazı yetkilendirmek isterler. Daha sonra, kullanıcı kimlikleri için verilen simgeleri temizleyen ve kendisine atanan tüm simgeleri yetkilendiren bir işlem yapabileceklerdi. Başka bir yol var mı? Bu yanlış ya da aşırı karmaşık şeyler düşünüyorum? Bu, bir mobil APP'den çağrılacak bir REST API'sini güvenli hale getirmek içindir.JWT'yi bir veritabanında depolamak mantıklı mı?

cevap

12

JWT'yi db'de saklayabilirsiniz, ancak bir JWT'nin bazı avantajlarını kaybedersiniz. JWT, jetonun meşru olduğunu doğrulamak için sadece şifreleme kullanabildiğiniz için her zaman bir db'de belirteci kontrol etmenize gerek kalmadan avantaj sağlar. Eğer db'de belirteci aramak zorunda kalırsanız, onunla bilgi taşımayan bir opak jetonu kullanabilir ve sunucu ile veri tabanının size bilgi vermesini sağlayabilirsiniz. Diğer taraftan, eğer db'de bir jetonu saklayacaksanız, JWT'nin belirteç tipiniz için kötü bir seçenek olduğunu düşünmüyorum. Dediğiniz gibi, belirtinizi db'de saklarsanız iptal etme için avantajlar vardır. Her şey, elde etmek istediğiniz şeye bağlıdır (daha hızlı yetkilendirme, vs. talep üzerine iptal etme yeteneği).

İsterseniz Db'de jetonları kaydetmeden JWT'yi OAuth2 ile kullanabilirsiniz. JWT'lerin ayarlayabileceğiniz yapılandırılabilir bir son kullanma süresi vardır - bundan sonra geçersizdirler. Erişim Jetonları (JWT olsun ya da olmasın) genellikle güvenlik için kısa ömürlü olmalıdır. Endişe, birisinin telefonunun çalınması ve erişim elde etmesine izin verilmesi durumunda, çözümün bu belirteçlerin hızlı bir şekilde sona ermesi (30 dak.) Olduğunu düşünüyorum. Eğer oauth2 kullanıyorsanız, uygulamayı kullanmaya devam etmemek için birisinin durdurulması, gerçek sahibin, yetkilendirme sunucusundaki mobil uygulama istemcisini yetkilendirmesine izin vermeyecek, böylece daha fazla erişim jetonu verilmeyecektir.

+0

Yani OAUTH2 (proje gereksinimi, başka bir API ile arabirim kurmak için gerekli) varsayılan belirteçler ile daha iyi sunucu yapışmasını, bunları veritabanında saklamak ve JWT'yi kazıyorum diye düşünüyorsunuz? Bu örnek için veriyi token içinde saklamama gerek yok (düzenli olarak erişilen ve düzenli olarak erişilen bazı ortak erişimlere erişmek için yapıyordum ama onsuz gerçekten başarabiliyordum). – laurentius

+0

, sorunuzu yanıtlamak için ikinci bir paragraf ekledi – sdoxsee

+0

Bir DB'de depolanmadığında bir jwt'yi kimlik doğrulamayı nasıl çözersiniz? Örneğin bir telefon çalınırsa. Ve 30 dakika geçmedi hırsız 30 dakika geçtikten sonra kullanıcı verilerine sınırsız erişime sahip. – Byrd

3

Son kullanma tarihini ayarlayabilirsiniz (cep telefonu için 1 hafta). Kullanıcı için bazı özel alan refreshId'u ekleyin (bunun için uuid'i kullanabilirsiniz). Sonraki set Claim Parametre ("iat") ile verilir. refreshId'u db'ye kaydedin ve talep parametresi olarak ayarlayın. Ardından, jetonu doğruladığınız her zaman, jetonun "yaşını" kontrol etmelisiniz. Bir saatten büyükse, DB'den veri yüklemeli ve refreshId değerini kontrol etmeli ve geçerli "iat" değerine sahip yeni jeton oluştur ve onu mobil cihaza gönder. Jetonları devre dışı bırakmanız gerektiğinde, db'de refreshId için yeni bir değer yaratın. Bir saat sonra tüm jetonlar yanlış olur, bu yüzden kullanıcının tekrar her cihazda giriş yapması gerekir. Gerekirse daha özel bir çözüm yapabilirsiniz.