JWT, localStorage'da mı yoksa tanımlama bilgisinde mi saklanmalıdır? [çiftleme]


105

Bazı malzemelere göre (bu kılavuz ve bu soru gibi ), JWT kullanarak REST API'nin güvenliğini sağlamak amacıyla, JWT, localStorage veya Cookies'de saklanabilir . Anladığıma göre:

  • localStorage , XSS'ye tabidir ve genellikle içinde herhangi bir hassas bilginin saklanması önerilmez.
  • İle Çerezler biz hangi azaltır XSS riski bayrağı "httpOnly" başvurabilir. Bununla birlikte, arka uçtaki Çerezlerden JWT'yi okuyacaksak, CSRF'ye tabi oluruz.

Dolayısıyla, yukarıdaki önermeye dayanarak - JWT'yi Çerezlerde saklamak en iyisi olacaktır. Sunucuya yapılan her istekte, JWT Çerezlerden okunacak ve Bearer şeması kullanılarak Yetkilendirme başlığına eklenecektir. Sunucu daha sonra istek başlığındaki JWT'yi doğrulayabilir (tanımlama bilgilerinden okumak yerine).

Anladığım doğru mu? Varsa, yukarıdaki yaklaşımın herhangi bir güvenlik endişesi var mı? Ya da ilk başta localStorage kullanmaktan kurtulabilir miyiz?



@ lrn2prgrm (durum bilgisi olmayan) JWT ve (durum bilgisi olan) oturum anlamlarını birlikte kullanmamalı.
ozanmuyes

@corlaez JWT kullanıyorum ve jwt'mi doğrulamak için sunucu tarafında Kimlik Doğrulama başlığı "Bearer mytoken" kullanmayı planlıyorum. Kafamdaki karışıklık şudur: Orijinal jwt'yi ilk oturum açma sırasında (sunucudan tarayıcıya gönderilen) bir çerezde httpOnly bayrağıyla gönderirsem, jwt'yi sonraki istekler için Kimlik Doğrulama başlığıma koymak için istemci tarafından nasıl çıkarabilirim? HttpOnly bayrağı istemci tarafındaki bir tanımlama bilgisinden bilgi almamı engellemez mi?
Harshit Trehan

Yanıtlar:


60

@ Pkid169'un söylediği makalede bahsedilen XSRF Double Submit Cookies yöntemini seviyorum, ancak makalenin size söylemediği bir şey var. Hala XSS'ye karşı korunmuyorsunuz çünkü saldırganın yapabileceği şey, CSRF tanımlama bilginizi (HttpOnly değil) okuyan komut dosyası enjekte etmek ve ardından bu CSRF belirtecini kullanarak API uç noktalarınızdan birine JWT tanımlama bilgisinin otomatik olarak gönderilmesi için bir istekte bulunmaktır.

Yani gerçekte hala XSS'ye duyarlısınız, sadece saldırgan daha sonra kullanmak için JWT jetonunuzu çalamaz, ancak yine de XSS kullanarak kullanıcılarınız adına istekte bulunabilir.

İster JWT'nizi bir localStorage'da depolayın, ister XSRF-belirtecinizi yalnızca http olmayan tanımlama bilgisinde depolayın, her ikisi de XSS tarafından kolayca yakalanabilir. HttpOnly tanımlama bilgisindeki JWT'niz bile gelişmiş bir XSS saldırısı tarafından yakalanabilir.

Bu nedenle, Çifte Gönderme Çerezleri yöntemine ek olarak, içerik çıkışı dahil XSS'ye karşı her zaman en iyi uygulamaları izlemelisiniz. Bu, tarayıcının istemediğiniz bir şeyi yapmasına neden olabilecek çalıştırılabilir kodların kaldırılması anlamına gelir. Tipik olarak bu, JavaScript'in değerlendirilmesine neden olan // <! [CDATA [etiketlerinin ve HTML özniteliklerinin kaldırılması anlamına gelir.


12
HttpOnly tanımlama bilgisindeki bir JWT'nin nasıl yakalanabileceğini açıklayabilir misiniz? XSRF belirteci XSS tarafından tehlikeye atılırsa XSRF tarafından kullanılabilir, ancak gerçekten kendisi ele geçirilebilir mi?
Jacek Gorgoń

1
Bunun eski bir gönderi olduğunu biliyorum, ancak bazı sorular sormak istiyorum ... Bu, iyi hazırlanmış komut dosyalarının hem localStorage'ı hem de çerezi okuyabileceği anlamına mı geliyor? Öyleyse, tarayıcıda nerede saklasak da bir JWT'nin çalınabileceğini varsaymak güvenli midir? O zaman, yalnızca bir JWT'ye güvenmenin çok riskli olduğunu hissediyorum.
Hiroki

2
"HttpOnly çerezindeki JWT'niz bile gelişmiş bir XSS saldırısı tarafından yakalanabilir." yanlış. Bunu düzeltmek için orijinal gönderi düzenlendi.
java-addict301

"HttpOnly çerezindeki JWT'niz bile gelişmiş bir XSS saldırısı tarafından ele geçirilebilir" Birisinin çerezi kendi sunucusuna göndererek yakaladığını hayal edebiliyorum. Bunun için, kimlik bilgisi bayrağının uygun değeriyle getirme işlevini kullanabilir. Buradaki ana sorun CORS korumasıdır, ancak bazı durumlarda bunun mümkün olduğunu düşünüyorum.
bartnikiewi.cz

"CSRF tanımlama bilginizi (HttpOnly değil) okuyan komut dosyası enjekte edin" Html.AntiForgeryToken()ASP.NET MVC'nin varsayılan uygulaması , CSRF simgesi için bir HttpOnly tanımlama bilgisi kullanır. Bence hala belirli XSS'ye duyarlısın, ancak bundan bahsetmeye değer olduğunu düşündüm.
Lovethenakedgun

22

Stormpath'ten zamanında gelen bir gönderi , noktaları hemen hemen detaylandırdı ve sorumu yanıtladı.

TL; DR

JWT'yi çerezlerde saklayın, ardından JWT'yi daha önce bahsettiğim gibi her talepte Yetkilendirme başlığından geçirin veya makalenin önerdiği gibi, CSRF'yi önlemek için arka uca güvenin (örneğin xsrfToken, Angular durumunda kullanma ).


2
Merhaba, bunun doğru olup olmadığından emin değilim, ancak denetleyicileriniz için CrossOrigin'i uygularken jwt'yi depolamak için çerezleri kullanmanın belirli dezavantajları var mı, bu, sunucu uygulamamın farklı bir yerde bulunduğu ve biz başka bir şehirde bulunan müşteri uygulamamızdan api? Pek çok web hizmeti sağlayıcısının çerez kullanmaktan kaçınmasının nedeni bu değil mi?
valik

CrossOrigin fiziksel konumlar anlamına gelmez. Diğer alanlardan gelen talepleri ifade eder. .Net çekirdeğinde CORS kullanmaya karar verdiğinizde, hangi etki alanlarına izin vereceğinizi belirtirsiniz; hangi başlıklara izin vereceğiniz vb.
Brian Allan West

12
  • Belirteçinizi LocalStorage veya SessionStorage'da saklamayın, çünkü bu tür belirteç javascript'ten okunabilir ve bu nedenle XSS saldırısına karşı savunmasızdır.
  • Jetonunuzu Cookie'de saklamayın. Çerez (HttpOnly işaretiyle) daha iyi bir seçenektir - XSS'ye eğilimlidir, ancak CSRF saldırısına karşı hassastır

Bunun yerine, oturum açarken iki jeton sunabilirsiniz: erişim jetonu ve yenileme jetonu. Erişim belirteci Javascript belleğinde saklanmalı ve Yenileme belirteci HttpOnly Cookie'de saklanmalıdır. Yenileme belirteci yalnızca ve yalnızca yeni erişim belirteçleri oluşturmak için kullanılır - başka bir şey değil.

Kullanıcı yeni sekme açtığında veya site yenilendiğinde, Cookie'de depolanan yenileme belirtecine dayalı olarak yeni erişim belirteci oluşturma talebinde bulunmanız gerekir.

Ayrıca bu makaleyi okumanızı şiddetle tavsiye ederim: https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/


6
Yenileme belirtecini bir erişim belirteci olarak ele alabildiğiniz zaman neden eklenen karmaşıklık? Nasıl bu yaklaşım daha benim erişim olarak belirteci işaretlemek verilen güvenli olup secure, samesite: strict, http-only?
Charming Robot

daha güvenli değil
Chris Hawkes

3

Mevcut tanımlama bilgilerinden yararlanan CSRF saldırılarını önlemeye yardımcı olmak için, tanımlama bilginizi SameSiteyönergeyle ayarlayabilirsiniz . laxVeya olarak ayarlayın strict.

Bu hala bir taslaktır ve 2019 itibariyle tüm mevcut tarayıcılar tarafından tam olarak desteklenmemektedir , ancak verilerinizin hassasiyetine ve / veya kullanıcılarınızın kullandığı tarayıcılar üzerindeki kontrolünüze bağlı olarak uygun bir seçenek olabilir. Yönergeyi ile ayarlamak, SameSite=lax"'güvenli' ... HTTP yöntemi kullanan üst düzey gezinmelere" izin verir.

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.