概要
JWTについて調べたことをまとめておく。 OAuthやOpen ID Connectなど実際の利用事例については触れない。
JWTとは
JWT(JSON Web Token)は、JSONデータ構造を用いたURLセーフなClaim(JWTを用いたJSONオブジェクトはClaim Setと呼ばれる)を表現するフォーマット。 JWTでは、デジタル署名またはメッセージ認証コード(MAC)を用いたJWS(JSON Web Signature)、あるいは暗号化を用いたJWE(JSON Web Encryption)が利用される。
JWT、JWS、JWEのそれぞれのRFCは下記の通り。 ietf.org - rfc7519 JSON Web Token ietf.org - rfc7516 JSON Web Encryption ietf.orf - rfc7515 JSON Web Signature
その他の関連するRFCとしては、以下のようなものもある。
ietf.org - rfc7517 JSON Web Key
JWSやJWE,JWKの仕様で仕様される暗号化アルゴリズムと識別子に関する仕様。 ietf.org - rfc7518 JSON Web Algorithm
上記の仕様をまとめてJWxと呼ばれることがあるらしい。
JWTのデータ構造
jwt.ioでJWTのエンコードとデコードをUIで体験することができる。
JWTの例が下記。
ピリオドで区切られた3つのセクションはそれぞれ、ヘッダー.ペイロード.署名の役割を担っている。
ヘッダー、ペイロード、署名の順にデコードしたものが下記。
ヘッダー
ヘッダーには、署名の検証を行うためのデータ(JSONをBase64エンコードした文字列)が含まれる。
ペイロード
ペイロードはClaim(JSONをBase64エンコードした文字列)を含む。 Claimには以下の3種類がある。
Registered Claim Names
www.iana.org - jwtに登録済みのClaim。 必須ではなく、推奨。 Claimの種類はietf.org - rfc7519 JSON Web Tokenを参照。
Public Claim Names
JWTを使用するユーザーが自由に定義することができるClaimだが、衝突防止のため、www.iana.org - jwtに登録するか、別途対応をする必要がある。
Private Claim Names
JWTを使用する当事者間で自由に定義することができる。Registerd ClaimやPublic Claimで予約されているもの以外に限る。
署名
トークンの改ざん検証のためのデータを含む。
JWTとセキュリティ
JWTの扱いについての注意点は以下の記事がよくまとまっているので一読しておきたい。 auth0.com - JWT の最新ベスト プラクティスに関するドラフトを読み解く
GolangでJWTを使ってみる
JWSを用いたJWTの実装をGolangでやってみる。
コードはgithub.com - bmf-san/go-snippetsにも置いてある。
GolangでJWTを扱うためにgithub.com - dgrijalva/jwt-goというパッケージを利用している。