1/7 JWTについて
2/7 JSON Web Token(JWT)とは 情報を安全に送受信するためのJSONベースの規格 ユーザ ① Email パスワード ② トークン ③ リクエスト&トークン ④ レスポンス サービス サーバ トークンを用いる情報のやり取りの際、 暗号化したJSONをトークンとして扱うため、 全世界共通のルール「JWT」が定められた。
3/7 JWTの構造 JWTは3つの要素から成る。 各プロパティはクレームと呼ばれる ヘッダ ペイロード 署名 署名のアルゴリズムなどを 格納する 任意のクレームを格納する。 標準クレームのほかに カスタムクレームも格納できる エンコードしたヘッダとペイロードを 指定アルゴリズムと秘密鍵で暗号化する これらをそれぞれBase64urlでエンコードし、 「.」でつなげたものがトークンとして扱われる
4/7 JWTの利点 ・サーバの秘密鍵による署名を含めることができるため、 正規のトークンか判別しやすい ・「?」や「=」など、URLに影響を与える文字を含まない (URLセーフ) ・認証情報をJWTとしてユーザ側が保持することで、 複数のサービスへのSSOが容易になる
5/7 JWTによるログイン例 秘密鍵と公開鍵により、複数サーバに同時ログインできる 公開鍵 サーバA 公開鍵 サーバB Email パスワード 秘密鍵 JWT 認証サーバ ユーザ 公開鍵 JWT サーバC
6/7 JWTによる認証の弱点 ・サーバ側に情報を保持しないため、ユーザ依存の タイミングでトークンの完全無効化はできない ・XSS攻撃や秘密鍵漏洩による情報漏洩への対策が難しい ・サーバ側にJWTの情報を保存することで、上記問題に 対策できるが、スケーラビリティが損なわれる
7/7 JWTをどう使うか? ・ログイン時はJWTを使い、その後のセッション管理は セッションIDで行うか、JWTの情報をサーバに保存する →SSOに便利だが、JWTのステートレスの利点が失われる ・LocalStorageとCookieのどちらに保存するべきか →クライアント単体で保持する以上、どちらもリスクがある ・そもそも認証には使わない方がいいか →JWTは安全な送受信のための規格なので、 認証以外にも使い道はたくさんあると思われる