1. JSON Web Token (JWT)とは?
JSON Web Token(JWT)は、JSONオブジェクトによるメンバー間の安全な通信方式を定義するオープンスタンダード(RFC 7519)です。「署名」のおかげでこの情報を認証し、信頼できるブックマークすることができます。JWTの署名はHMACまたはRSAで暗号化されます。
2. JWTのハイライト:
小さいサイズ:JWTは、URL経由、POSTプロトコル経由で送信することも、HTTPヘッダーセクション内に挿入することもできます。サイズは小さければ小さいほど送信作業が早くなります。Bearer Schema を使用してトークンをHTTPヘッダに渡す方法は次のとおりです。
Authorization: Bearer <token>
クローズ:payload部分は利用する情報を含みます。例えば、ユーザーの情報です。
3. JWTの例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIwMTM0MDcyIiwibmFtZSI6IlRyYW5nIn0.rI6lvV8D5a2H9E5SJNSK5E0HjtnbApU8ysEOHlhvgQU
4. JWTの構築
JSON Web Tokenは3つの部分から構成されています、ドットで分けられます。
- Header
- Payload
- Signature (署名)
4.1. Header
Header にはデータ型とJWT文字列のエンコードに使用されるアルゴリズムが含まれます。
例えば:
{
“alg”: “HS256”,
“typ”: “JWT”
}
- “typ” (type) はオブジェクトがJWTであることを示します。
- “alg”(algorithm)は文字列の暗号化アルゴリズムがHS256であることを認識させます
4.2. Payload
Payload部分は文字列に入れたい情報が含まれます。例えば、user_name, user_id, email,…です。
Payloadの例:
{
“id”: “20134072”,
“name”: “Trang”,
}
サーバーはトークンが長すぎることを確認するのは時間がかかるので、ペイロードチェーンに情報を入れすぎないように注意してください。それにパスワードなど重要な情報を絶対に入れてはいけません。
4.3. Signature
このシグネチャは、ヘッダー、ペイロードと秘密の文字列を暗号化することによって作成されます。
例:
data = base64urlEncode( header ) + “.” + base64urlEncode( payload )
signature = Hash( data, secret );
base64urlEncode: headerとpayloadを暗号化するアルゴリズム
上記のコードはbase64urlEncodeでheaderとpayloadを暗号化して、下記の文字列を取得します。
// header
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
// payload
eyJpZCI6IjIwMTM0MDcyIiwibmFtZSI6IlRyYW5nIn0
それから、HMACSHA256アルゴリズムで上記の文字列の2つとsecret(秘密キー)を暗号化して、rI6lvV8D5a2H9E5SJNSK5E0HjtnbApU8ysEOHlhvgQUという形の署名を取得します。
最後、上の文字列の3つを結合して、eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIwMTM0MDcyIiwibmFtZSI6IlRyYW5nIn0.rI6lvV8D5a2H9E5SJNSK5E0HjtnbApU8ysEOHlhvgQU という形のJWTを取得されます。
5. JSON Web Tokenを使用する場合
Authentication: これはJWTで使用する最も一般的なケースです。ユーザーがシステムにログインして、ユーザーからの次のリクエストはJWTコードを含みます。これにより、トークンコードで許可されているURL、サービス、およびリソースへのアクセスをユーザーに許可できます。この方法は、Cookieを使用しないため、Cross-Origin Resource Sharing (CORS)による影響を受けません。
情報交換:JSON Web Tokenは、「署名」セクションのおかげで、メンバー間で安全に通信するための悪くない方法です。受信者は、送信者が誰であるかを署名セクションを通して知ることができます。それに、署名は、headerとpayloadを組み合わせることによって作成されるので、それを介して署名が偽造品かどうかを確認できます。