認証システムにJWTを実装しようとしていますが、いくつか質問があります。トークンを保存するには、Cookieを使用できますが、localStorage
またはsessionStorage
を使用することもできます。
どちらが最良の選択でしょうか?
JWTがCSRFからサイトを保護していることを読みました。ただし、JWTトークンをCookieストレージに保存すると、どのように機能するか想像できません。
それではCSRFからどのように保護しますか?
更新1
次のような使用例を見ました:
curl -v -X POST -H "Authorization: Basic VE01enNFem9FZG9NRERjVEJjbXRBcWJGdTBFYTpYUU9URExINlBBOHJvUHJfSktrTHhUSTNseGNh"
ブラウザからサーバーにリクエストを行うときに、どのように実装できますか?また、URLにトークンを実装している人もいます。
http://exmple.com?jwt=token
AJAX経由でリクエストを行う場合、jwt: [token]
そして、ヘッダーからトークンを読み取ることができます。
更新2
Advanced REST Client Google Chrome=拡張機能をインストールし、カスタムヘッダーとしてトークンを渡すことができました。サーバーにGETリクエストを送信しますか?
このWebサイトをご覧ください: https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
それらを保存する場合は、localStorageまたはsessionStorageを使用するか、Cookieを使用する必要があります。 Authorizationヘッダーも使用する必要がありますが、Basicスキームの代わりにBearerスキームを使用します。
curl -v -X POST -H "Authorization: Bearer YOUR_JWT_HERE"
JSでは、次のコードを使用できます。
<script type='text/javascript'>
// define vars
var url = 'https://...';
// ajax call
$.ajax({
url: url,
dataType : 'jsonp',
beforeSend : function(xhr) {
// set header if JWT is set
if ($window.sessionStorage.token) {
xhr.setRequestHeader("Authorization", "Bearer " + $window.sessionStorage.token);
}
},
error : function() {
// error handler
},
success: function(data) {
// success handler
}
});
</script>
ストレージを選択することは、決定的な最良の選択を見つけることよりも、トレードオフに関するものです。いくつかのオプションを見てみましょう。
localStorage
またはsessionStorage
)Authorization
スキームのBearer
ヘッダー)を渡すことができます。example.com
によって書き込まれた値はsub.example.com
によって読み取れません)Authorization
ヘッダーでトークンを渡します)ブラウザー localStorage
または sessionStorage
APIを利用して、リクエストの実行時にトークンを保存および取得します。
localStorage.setItem('token', 'asY-x34SfYPk'); // write
console.log(localStorage.getItem('token')); // read
Authorization
ヘッダーではなく、認証のためにCookieを検証する必要がありますブラウザが自動的に処理を行うため、クライアント側で何もする必要はありません。
Authorization
スキームのBearer
ヘッダー)を渡すことができます。Authorization
ヘッダーでトークンを渡します)ブラウザー document.cookie
APIを利用して、リクエストを実行するときにトークンを保存してから取得します。このAPIはWebストレージほどきめ細かいものではないため(すべてのCookieを取得)、必要な情報を解析するために余分な作業が必要です。
document.cookie = "token=asY-x34SfYPk"; // write
console.log(document.cookie); // read
これは奇妙なオプションのように思えるかもしれませんが、トップレベルドメインとすべてのサブドメインでストレージを利用できるという素晴らしい利点があります。これはWebストレージでは得られないものです。ただし、実装はより複雑です。
最も一般的なシナリオに対する私のの推奨事項は、主に次の理由により、オプション1を使用することです
また、Cookieベースのオプションもまったく異なることに注意してください。オプション3のCookieは、純粋にストレージメカニズムとして使用されるため、クライアント側の実装の詳細であるかのように見えます。ただし、オプション2は、認証を扱うより伝統的な方法を意味します。このCookie対トークンの詳細については、この記事がおもしろいと思うかもしれません: Cookie vsトークン:The Definitive Guide 。
最後に、どのオプションもそれについて言及していませんが、HTTPSの使用はもちろん必須です。これは、Cookieを適切に作成して考慮に入れる必要があることを意味します。
このブログ投稿では、ブラウザーストレージとCookieの優れた比較比較を行い、それぞれの場合に発生する可能性のあるすべての攻撃に対処しています。 https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
短い答え/ネタバレ:クッキーとjwtにxsrfトークンを追加します。ブログ投稿の詳細な説明。