Open6
【ユニット勉強会】JWTについて調べたことを共有する
JWTとは
JWT(JSON Web Token)はクレーム(主張)を安全に渡すために利用 される標準仕様。JSONWebSignatures(JWS、RFC75156) を使用して署名したり、JSONWebEncryption (JWE、RFC75167) を使用して暗号化が可能。
JWTの構成
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
- ヘッダー:ヘッダーは、トークンのタイプと使用される署名アルゴリズムの指定を含む。
- ペイロード: トークンに関連するクレーム(主張)が含まレル。これには、ユーザーIDやユーザーの権限、有効期限などの情報が入る。
- 署名:署名部分は、ヘッダーとペイロードを結合し、秘密鍵で署名することで生成される。これによって、メッセージが改ざんされていないことと、送信者の正当性が確認できる。
これらの3部分を組み合わせて、「.」で区切るとJWTの文字列が生成される。
JWTの主な使用用として、認証、認可、クライアント側セッション ("ステートレス" セッション)に利用される。また、JWTは情報を安全に送信する方法としても使用でき、署名によって、情報が信用できる発信元から来ていることと、情報が改ざんされていないことを保証できる。
注意点
JWTのペイロードは暗号化されていない為、セキュリティ面における考慮が必要。
JWE(JSON Web Encryption)
JWTのペイロードを暗号化するために、JWE(JSON Web Encryption)を使用する。
JWEの流れ
- コンテンツ暗号化鍵の生成: コンテンツ暗号化鍵(CEK)を生成。この鍵はペイロードの暗号化に使用さレル。
- ペイロードの暗号化: CEKを使用して、ペイロードを選択された暗号化アルゴリズムで暗号化。
- CEKの暗号化: 通信先の公開鍵を使用して、CEK自体を暗号化。
- JWEの構築: 暗号化されたCEK、暗号化アルゴリズムに関する情報、暗号化されたペイロードなどを組み合わせて、JWEトークンを構築。
JWEの構成
- ヘッダー: 暗号化に使用されるアルゴリズムとその他のパラメータを含むJSONオブジェクト。
- 暗号化されたキー: CEKの暗号化バージョン。
- 初期化ベクトル: ペイロードの暗号化に使用されるランダムなバイト列。
- 暗号文: 暗号化されたペイロード。
- 認証タグ: メッセージの整合性を確保するためのタグ。
各部分はBase64Urlエンコードされ、ピリオドで連結される。
認証と認可
JWTをセッションに使用する際の保存先(LocalStrage VS Cookieか)
セッション認証とトークン認証について
セッション認証
セッション認証は、ユーザがログイン成功した際に、ユーザ情報と紐付けたセッションIDを返す。
ユーザはこのセッションIDをCookieやlocalStrageに保存して、サーバー側へリクエストを送る。
トークン認証
トークン認証は、ユーザがログインした際にアクセストークンを発行する(*アクセストークンは、セッションIDとは異なり、ユーザ情報と紐付けされない)
アクセストークンは、改ざんが難しいJWT形式が採用されることが多い。
セッション認証はステートフルな通信であり、トークン認証はステートレスな通信
セキュリティに関する考慮事項
実際の使用例
クライアント側セッションの内容を認証および保護するために署名を使用し、暗号化を使用する。クライアン ト側のデータは改ざんされるおそれがあるため、バックエンドで処理する必要がある。