JWTとは
JSON Web Token
の略
ヘッダ
、ペイロード
、署名
の3つからなる- それぞれ、
Base64
でエンコードされている - エンコードされた文字列を
.
で繋いでいる
JWTはHTTPヘッダーで利用することを前提としたJSONの表現方法を定めているだけで、セキュリティについてはなにも考慮していません。
署名のところを、JWS(JSON Web Signature)
と言い、改ざん検知のために使われる。
→ 暗号化ではないため、JWSを入れてもデータを見たりすることはできてしまう。
JWT生成手順
// ヘッダー ・・・ BASE64 → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
{
"arg": "HS256", ・・・ ハッシュ化するアルゴリズム
"typ": "JWT"
}
// ペイロード ・・・ BASE64 → eyJpZCI6MX0=
// 実際にアプリケーションで受渡ししたい値
{
"id": 1
}
// 署名なしトークン
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MX0=
// 署名 ・・・ Base64 → ka6byTG9NqD+h0wV8ghn3FLVhvipJ9Qaq4e7e+t1kJI=
// 秘密鍵 = secret
echo -n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MX0=' | \
openssl dgst -binary -sha256 -hmac 'secret' | \
base64
// JWT(完成形)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MX0=.ka6byTG9NqD+h0wV8ghn3FLVhvipJ9Qaq4e7e+t1kJI=
特徴
Base64でエンコードしているだけのため、ヘッダとペイロードは誰でも簡単に見ることができる。
→ セッションハイジャック
そのため、ペイロードにパスワードなどの認証情報を含めてはいけない。
もしくは、ペイロードを暗号化してからBase64でエンコードする方法もある。
これをJWE(JSON Web Encryption)
という。
検証
上記の生成手順からもわかる通り、署名はヘッダとペイロードを暗号化したものである。
そのため、署名を複合して、元々のヘッダ、ペイロードと同じものになるかを検証することになる。
まとめ
- Base64でまとめているだけなので、中身はスカスカ → セッションハイジャック
- データ量が多くなるに比例して、通信量も増える
コメント