まいだいありー

機械学習、技術系、日記など勉強したことのメモを書けたらなと思います。

JWT (JSON Web Token) についてメモ

JWTとは

最近 JWT認証を使う機会があったので, JWTの生成方法についてまとめます.

JWTは, 以下のような構造

{base64Encodingheader}.{base64Encodeingclaim}.{signature}


JWT生成

  • base64Encodingheader

以下のJsonbase64エンコード

{
  "alg":  署名アルゴリズム, RSA-SHA256など
  "typ": "JWT"
}


{
  "sub": ユーザの識別子
  "iat": トークンの発行時間,
  "exp":トークンの有効期限,
    ...etc
}


  • signature(署名)

HeaderとClaimをbase64エンコードした文字列を . で結合したものと秘密鍵 Keyで署名アルゴリズムによって,ハッシュ化.

signature = RSA-SHA256(Key , "{base64Encodingheader}.{base64Encodeingclaim}")


この工程でJWTが生成できます.

JWT = "{base64Encodingheader}.{base64Encodeingclaim}.{signature}"


JWT の比較

JWTを発行するサーバで既にユーザ1は登録済み時, ユーザ1から受信したJWTがユーザ1のものか比較する.


以下を受診した JWT とする

_JWT = "{_base64Encodingheader}.{_base64Encodeingclaim}.{_signature}"


ユーザ1が持ってる秘密鍵 Keyと送信されたJWTの署名部分以外を用いて, 署名アルゴリズムでhash化.

signature = RSA-SHA256(Key , "{_base64Encodingheader}.{_base64Encodeingclaim}")


そして, 受信された署名と今生成した署名を比較することで同じユーザのものか検証できる.

if signature == _signatture:
    return 1
else:
    return 0