JWTとは
ジョットと読む。
JWTは従来のセッションキーをクライアント・サーバ間でやり取りしてセッションを維持する方法に対して、JSON形式のトークンにユーザ情報を格納した上で暗号化し、その暗号化データをクライアント・サーバ間でやり取りしてセッションを維持する方法である。
セッションキー方式ではセッションキーを元にしてサーバ側でユーザ情報をDBから検索する必要があるのに対し、JWTではユーザ情報そのものがトークンに入っているので復号すればDBアクセスなしにすぐにユーザ情報を使用できる点でパフォーマンスに優れる。ただし、ログイン(認証)時は当然DBアクセスが必要。
一方JWTのトークンデータはセッションキーよりサイズが大きくなりがちであり、トークンの受け渡し方式がcookieであれば4096バイト制限に引っ掛かりかねない点がデメリットである。
また、暗号鍵が漏洩すればユーザが自身のトークンを復号して内容を確認できるというリスクがあるのもデメリットである。ユーザごとに暗号化鍵を変えることで万が一トークンが漏洩してもトークンの復号は困難にはなる。
なお、暗号化は共通鍵暗号方式でも公開鍵暗号方式でも良い。クライアント側で情報を利用する必要があるなら公開鍵暗号方式を利用し、不要であれば共通鍵暗号方式を利用する。
JWTの受け渡し
JWTはセッション情報の保持についての仕様であり、そのクライアント・サーバ間での受け渡しについては規定しておらず任意である。
ただ基本的にはセッションキーと同じ、従来からの方法を使用することとなる。
- Cookie
Cookieとして格納する。Cookieは一度格納すれば、自動的にクライアント・サーバ間で受け渡しがされるので扱いが簡単である。設定によってはブラウザ上で動作するJavaScriptから読み取り不可にできるのでセキュリティ面でも強い。ただし、データサイズ上限が4096バイトであるという制約がある。 - Authorization Bearerヘッダー + ローカルストレージ
HTTPヘッダーに挿入して送信する。一般的にAuthorization Bearerという名前でヘッダー名を設定して送信する。ヘッダーはブラウザ側のJavaScriptで明示的に挿入する必要あり、CSRサイト向けである。ブラウザ側のJavaScriptでトークンにアクセスする必要がある点や明示的にトークンを挿入して送信する点から、トークンの保存はCookieよりローカルストレージに保存する方がメリットが多い。 - クエリストリング
URLの末尾に付ける。HTMLを返却する際にすべてのリンクを修正してから返す仕組みが必要である。また、一度サイトを離れてブックマーク等から再度サイトにアクセスした際にセッション情報が消える点が不便である。基本的に使用しない。 - Hiddenフィールド
HTML中の非表示の要素に埋め込み、サーバにPOSTアクセスする際に一緒に送ってもらう。POSTメソッド以外では送信されず使いづらいし、各ページにわたってセッションを維持するなら各ページにHiddenフィールドを毎回埋め込む仕組みが必要になる。基本的に使用しない。
JWTの使い方
各プログラミング言語の各ライブラリを使用するのが簡単ではあるが、JSON+暗号化・復号を自前で行うのであれば特にライブラリは不要でる。
使用できるライブラリはこちらを参考