【速習】JWT・JOSE
はじめに
JWTに関して勉強していたところ、外コン出身者でもびっくりの謎の略称が大量に出てきたため、その備忘録。
詳しい解説は多数あるので、ここでは分かりやすく端的に表現しています。
詳細で正確な情報に関してはRFCなどの参考文献を参照してください。
JWT : Json Web Token
JSON形式のデータをHTTPヘッダーや、URLクエリに付加できる形にすることを目的とし、
ヘッダーとペイロードをBase64urlエンコードによりURLセーフな形にした文字列のこと。
JWT自体は上記を定義したもので、署名機能や暗号化機能はJWS、JWEという別のRFCで定義されている。
JWTはJWS、JWE、またはその両方によってエンコードされるために署名機能や暗号化機能を持つ。
JOSE : JSON Object Signing and Encryption
JSON Object Signing and Encryptionの略。
JSONを利用したデータ転送用の規格群のことで、以下の3つを基本として定義する。
- JWS: 整合性保護されたオブジェクト形式
- JWE: 機密保護されたオブジェクト形式
- JWK: キーを表現するためのフォーマット
JWS : JSON Web Signature
発行者と改ざんに関する整合性を保証するオブジェクト形式。
ヘッダー、ペイロード、署名の3ブロックによって成り立ち、
Base64では <ヘッダー>.<ペイロード>.<署名> という形式となる。
ヘッダー
暗号化に関する設定やキーを記述する
ペイロード
内容に関する記述
署名
ヘッダーとペイロードの情報をもとに生成された署名
JWT(JWS)の生成と確認
生成
- ヘッダーに形式や暗号化に関する設定を書き込む
- ペイロードにJWTの発行時刻や利用者情報などを書き込む
- Base64urlエンコードし、署名なしトークンを生成: <ヘッダー>.<ペイロード>
- 署名なしトークンに対して、秘密鍵とHMAC-SHA256を用いて署名を生成
- 署名をBase64エンコードして、出来上がり!! <ヘッダー>.<ペイロード>.<署名>
確認
- 署名をデコードし、公開鍵を使用して復号する。
- <ヘッダー>.<ペイロード> と復号した値を比較して同じなら整合!
JWE : JSON Web Encryption
JWT、JWSの内容を暗号化することにより、機密保護を行うためのフォーマット。
以下の記事が参考になる。というか見てください。。
JWEについて調査すると、いくつか脆弱性が指摘されるとの内容が見られる。
以下のQiitaでは2020年時点では脆弱性が解決されたかの調査をしている。
使用する際にはある程度のサーベイと判断が必要か。
JWK : JSON Web Key
暗号鍵(公開鍵)をJSON形式で配布するためのフォーマット
JWSのヘッダーに鍵の識別士kidを付加することでJWKsのどの公開鍵に対応するかを示す。
実装方法
以下の記事がわかりやすかった。
が、スクラッチは脆弱性のもと。基本的にはライブラリや認証系サービスを使用しましょう。
参考文献
JWTについて
JOSEについて
実装
Discussion