JWTとは

概要

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というパッケージを利用している。

参考