🔐
JWT(JSON Web Token)
なにか
JSON Web Tokensは、2者間でクレームを安全に表現するためのオープンな業界標準 RFC7519メソッドです。
- ユーザーがログインする(本人であるという証明)
- サーバーがJWTを発行し、レスポンスに付加する(本人であるということを認証)
- 以降、リクエスト・レスポンスにJWTを付加し、都度、JWTを検証することで上記の状態を保証する
仕組み(JWS = Json Web Signature)
実際に使用されているのは、JSON Web トークンに署名(シグネチャ)した文字列を連結した"JWS"が使用されている
JWSはドット (.) で区切られた3つの部分で構成されている
- ヘッダー
- ペイロード
- シグネチャ
ヘッダー
{
"alg": "HS256", // 署名に使用するアルゴリズム
"typ": "JWT" // トークンのタイプ
}
ペイロード
クレームといわれる値が含まれる
iss (発行者)、exp (有効期限)、sub (件名)、aud (対象者)
エンティティ(認証されたユーザーの)等
参考
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
シグネチャ
ヘッダーとペイロードをBase64Urlエンコードし、ヘッダーで指定されているアルゴリズム(今回だと、"alg": "HS256")で変換したものになる
以下で、変換された値が、シグネチャとなる
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret // 秘密鍵
)
JWS発行後
下記のような形で、付加され送信される
Authorization: Bearer <token>
秘密鍵と対になっている公開鍵を使用することで、トークンが改ざんされているか否か検証することができる
セキュリティ
トークンがまるごと抜き取られた場合、そのトークンを使用してapiのリソース等を操作できてしまう
対策としては
- トークンの期限は短く設定する(アクセストークンが30m、リフレッシュトークンを24hにする等)
- 登録情報の変更など、重要な処理をする場合は、二段階認証等の確認処理を挟む
その他
IDフェデレーション( ≒ SSO?)
- 認証サーバー(Facebook等のSNS)で、ログインし認証情報を発行
- その情報を使用し、その他のリソースを使用する
Discussion