JWT(JSON Web Tokens)とは何か
JWTとは何か
JWTは、サーバ上に認証状態を保持しないステートレスな認証方式。 サーバは Authorization ヘッダーで渡されたトークンが正しいかだけを検証し、アクセスを許可する。 JWTにおいては、認証に必要な情報は全てトークン内に格納されており、データベースへの問い合わせを削減することができる。
脆弱性について
JWTはステートレスであることから、JWT単体ではトークンを無効にすることが出来ない。従来のセッション同様、サーバに状態を保持すれば可能だが、その場合ステートレスの利点は失われる。
対策方法は以下が考えられる。
JWTヘッダーだけを見て検証しない。
アルゴリズムについて知る。
適切なキーサイズを用いる
有効期限の管理
JWTには有効期限を表すexp(Expiration Time)クレームがある。
クライアント側でJWTの有効期限を管理し、有効期限を過ぎた場合、再認証が必要になる。
JWTのメリット
ステートレスで処理が単純化される
中間サーバを経由せずにリソースサーバへのアクセストークンを渡せる。別途データベースや参照元にアクセスする必要がない。
ペイロードにカスタム情報を含められる
デジタル署名によってデータの改ざん検知が可能
リフレッシュトークンとアクセストークンの違い
JWTはアクセストークンの位置づけなので、セッション管理のようなリフレッシュトークンには向かない。
アクセストークンとは?
アクセストークンは、クライアントがリソースサーバーの保護されたリソースにアクセスするために必要のトークンです。
アクセストークンの有効期限は短く設定されている場合が多いです。(イメージとしては数十分〜数時間)
リフレッシュトークンとは?
リフレッシュトークンは、アクセストークンを再発行するために使用するトークンです。
リフレッシュトークンは有効期限が長く設定される場合が多いです。(イメージとしては日単位)
アクセストークンを発行できるので、流出した場合のリスクが大きく、厳重に管理する必要があります。
JWTはセッションの代わりになるのか?
https://gyazo.com/929e244f74738a8974e29696e2914207
なりません。
セッションが担っていた一部である認証に関しては限定条件で効果的に果たせそうです。ただ、そもそも状態の保存ができません。「ペイロードに格納すれば良いじゃん?」って話ですがそれは都度都度アクセストークン発行すれば出来ますが、たとえばAmazonの買い物カゴみたいなのをJWTで作るのはかなり面倒では。
その場合は大人しくCookieやLocal Storageに格納してAPIのBodyに入れるのが良いかと思います。暗号化もサポートしてるけど多少センシティブなものも突っ込めそうですが、ストレージとしての用途を考えて作ってるとは想定しづらいのでセッションの単純置き換えは無理でしょう。この点に関してはそう思ってる人も多分居ないと思いますが。
参考