JWTは、header・payload・signatureの3つの部分でできている
JWTは、base64urlでエンコードした3つの部分を、ドットでつないだものです。header.payload.signatureという形になります。headerは、署名のアルゴリズムを示します。payloadは、クレームと呼ばれるデータを持ちます。ユーザーのidや、有効期限を表すexpフィールドなどが入ります。
signatureは、署名する側が、署名用の鍵を使って、headerとpayloadから計算します。検証する側は、署名を再計算して一致するかを確かめ、署名した時点からheaderとpayloadが変わっていないことを確認します。payloadを1文字でも変えると、署名がまったく別の値になるため、一致しなければ改ざんが分かります。
payloadは、暗号化ではなくエンコードされているだけなので、鍵がなくても、誰でも中身を読めます。検証で確かめられるのは、内容の秘密ではなく、改ざんがないことです。
この課の目標
JWTを3つの部分に分解できる。署名検証と有効期限の確認がそれぞれ何を確かめているかを説明できる。
JWTのpayloadが{ "role": "user" }から{ "role": "admin" }に、再署名せずに変更された。サーバーが検証すると何が起きる?