JWT'ler bağlamında Stormpath , bunları saklamanın olası yollarını ve her yönteme ait (dis) avantajları özetleyen oldukça yararlı bir makale yazmıştır.
Ayrıca XSS ve CSRF saldırılarına ve bunlarla nasıl mücadele edebileceğinize kısa bir genel bakış vardır.
Makalelerinin çevrimdışı olması / sitelerinin kapanması durumunda aşağıdaki makalenin bazı kısa parçacıklarını ekledim.
Yerel depolama
sorunlar:
Web Depolama'ya (localStorage / sessionStorage) aynı etki alanındaki JavaScript aracılığıyla erişilebilir. Bu, sitenizde çalışan tüm JavaScript'lerin web depolama alanına erişebileceği ve bu nedenle siteler arası komut dosyası (XSS) saldırılarına karşı savunmasız olabileceği anlamına gelir. Özetle XSS, bir saldırganın sayfanızda çalışacak JavaScript enjekte edebileceği bir tür güvenlik açığıdır. Temel XSS saldırıları, saldırganın uyarıda bulunduğu form girişleri aracılığıyla JavaScript enjekte etmeyi dener ('Saldırıya Uğradınız'); tarayıcı tarafından çalıştırılıp çalıştırılmadığını ve diğer kullanıcılar tarafından görüntülenip görüntülenemeyeceğini görmek için bir forma dönüştürün.
önleme:
XSS'yi önlemek için ortak yanıt, güvenilir olmayan tüm verilerden kaçmak ve kodlamaktır. Ama bu hikayenin tamamından uzak. 2015 yılında, modern web uygulamaları CDN'lerde veya dış altyapıda barındırılan JavaScript kullanır. Modern web uygulamaları A / B testi, huni / pazar analizi ve reklamlar için 3. taraf JavaScript kitaplıklarını içerir. Diğer insanların kodlarını uygulamalarımıza aktarmak için Bower gibi paket yöneticilerini kullanıyoruz.
Kullandığınız komut dosyalarından yalnızca biri tehlikeye girerse ne olur? Kötü amaçlı JavaScript sayfaya gömülebilir ve Web Deposu tehlikeye atılır. Bu tür XSS saldırıları, herkesin sitenizi ziyaret eden Web Depolama Alanlarını bilgisi olmadan alabilir. Muhtemelen bir grup kuruluş, değerli bir şey depolamamanızı veya web depolama alanında herhangi bir bilgiye güvenmemeyi tavsiye eder. Buna oturum tanımlayıcıları ve simgeleri de dahildir.
Bir depolama mekanizması olarak, Web Depolama aktarım sırasında güvenli bir standart uygulamaz. Her kim Web Depolama'yı okur ve kullanırsa, JWT'yi her zaman HTTPS üzerinden göndermelerini ve asla HTTP göndermemelerini sağlamak için gereken özeni göstermelidir.
Kurabiye
sorunlar:
Çerezlere, HttpOnly çerez bayrağıyla birlikte kullanıldığında, JavaScript aracılığıyla erişilemez ve XSS'ye karşı bağışık değildir. Güvenli çerez bayrağını, çerezin yalnızca HTTPS üzerinden gönderileceğini garanti edecek şekilde de ayarlayabilirsiniz. Bu, geçmişte jeton veya oturum verilerini saklamak için çerezlerin kullanılmasının ana nedenlerinden biridir. Modern geliştiriciler çerezleri kullanmakta tereddüt ederler, çünkü geleneksel olarak sunucuda depolanması için durum gerektirirler, böylece RESTful en iyi uygulamalarını bozarlar. Depolama mekanizması olarak çerezler, çerezde bir JWT saklıyorsanız durumun sunucuda depolanmasını gerektirmez. Bunun nedeni, JWT'nin sunucunun isteği sunmak için ihtiyaç duyduğu her şeyi kapsadığıdır.
Ancak, çerezler farklı bir saldırı türüne karşı savunmasızdır: siteler arası istek sahteciliği (CSRF). CSRF saldırısı, kötü amaçlı bir web sitesi, e-posta veya blog, kullanıcının web tarayıcısının, kullanıcının kimliğinin doğrulandığı güvenilir bir sitede istenmeyen bir eylem gerçekleştirmesine neden olduğunda ortaya çıkan bir saldırı türüdür. Bu, tarayıcının çerezleri nasıl ele aldığından yararlanır. Bir çerez yalnızca izin verildiği alanlara gönderilebilir. Varsayılan olarak, bu tanımlama bilgisini başlangıçta ayarlayan alandır. Tanımlama bilgisi galaxies.com'da veya hahagonnahackyou.com'da olup olmadığınıza bakılmaksızın bir istek için gönderilir.
önleme:
Modern tarayıcılar, SameSite
bayrağa ek olarak HttpOnly
veSecure
. Bu bayrağın amacı, çerezin siteler arası taleplerde iletilmesini ve birçok CSRF saldırısının önlenmesidir.
Desteklemeyen tarayıcılar SameSite
için senkronize edilmiş token kalıpları kullanılarak CSRF önlenebilir. Bu karmaşık görünüyor, ancak tüm modern web çerçeveleri bunu destekliyor.
Örneğin, AngularJS, tanımlama bilgisine yalnızca alan adınız tarafından erişilebildiğini doğrulamak için bir çözüme sahiptir. AngularJS belgelerinden doğrudan:
XHR isteklerini gerçekleştirirken, $ http hizmeti bir çerezden (varsayılan olarak XSRF-TOKEN) bir simge okur ve bunu HTTP üstbilgisi (X-XSRF-TOKEN) olarak ayarlar. Yalnızca alan adınızda çalışan JavaScript çerezi okuyabildiğinden, sunucunuzun XHR'nin alan adınızda çalışan JavaScript'ten geldiğinden emin olabilirsiniz. Bu CSRF korumasını bir xsrfToken
JWT iddiası ekleyerek durumsuz hale getirebilirsiniz :
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
Web uygulama çerçevenizin CSRF korumasından yararlanmak, çerezleri bir JWT depolamak için sağlam hale getirir. CSRF, API'nizden HTTP Tavsiye ve Kaynak üstbilgisi kontrol edilerek de kısmen önlenebilir. CSRF saldırılarında uygulamanızla ilgisi olmayan Yönlendiren ve Köken başlıkları bulunur.
Makalenin tamamını burada bulabilirsiniz:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
Ayrıca, jetonun yapısı ile ilgili olarak JWT'lerin en iyi nasıl tasarlanacağı ve uygulanacağı konusunda yararlı bir makaleleri var:
https://stormpath.com/blog/jwt-the-right-way/