概要
JSON Web Token(JWT)とは
JSON Web Token(JWT)とは、Web 上にて、2 者間で情報を安全に転送するための JSON オブジェクトです。認証システムや情報交換等に用いられます。トークン は、主にヘッダー、ペイロード、署名からなっており、ドット ”.” で区切られています。
この情報は、デジタル署名されているため、信頼することができます。
PyJWT とは
JWT トークンをエンコード、デコードしてくれる Python ライブラリです。
インストール
pip
でインストールできます。
PyJWT を使ってみる
エンコード
PyJWT を使って、JWT を作成してみます。
次のコードで、JWT ができることを確認してみます。
payload_data という変数に転送するペイロード情報を JSON 形式で記述します。
jwt.encode()
関数を使って、トークンを生成します。jwt.encode()
関数の第 1 引数は、JWT としてエンコードする payload_data を、第 2 引数には、アルゴリズムに適したキーを、第 3 引数には、トークンを署名するためのアルゴリズムを渡します。
最後に得られたトークンを表示しています。
このコードを jwt-test.py
というファイル名で保存します。
import jwt
payload_data = {
"id": "001",
"name": "hakky",
"email": "hakky@email.com"
}
key = "my_secret"
token = jwt.encode(
payload=payload_data,
key=key,
algorithm="HS256"
)
print(token)
実行してみると、以下のトークンが得られます。
$ python jwt-test.py
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjAwMSIsIm5hbWUiOiJoYWtreSIsImVtYWlsIjoiaGFra3lAZW1haWwuY29tIn0.AvLXzyxzX4Jy0rzDcHWWQeMC57N4dGqf6sXyYQOkyEg
得られたトークンを JSON Web Tokens で検証してみると、payload_data で設定した値になっていることが分かります。

デコード
先ほどのコードに、得られたトークンをデコードするコードを追加します。
デコードは、jwt.decode()
関数で行えます。jwt.decode()
関数の第 1 引数は、JWT としてデコードするトークンを、第 2 引数には、アルゴリズムに適したキーを、第 3 引数には、トークンを署名したアルゴリズムを渡します。
最後にトークンをデコードした結果を表示しています。
import jwt
payload_data = {
"id": "001",
"name": "hakky",
"email": "hakky@email.com"
}
key = "my_secret"
token = jwt.encode(
payload=payload_data,
key=key,
algorithm="HS256"
)
print(token)
result = jwt.decode(token, key, algorithms="HS256")
print(result)
実行してみると生成されたトークンに続いて、それをデコードした結果が表示されます。
トークンが正しくデコードされて、元の payload_data に記述したペイロード情報が得られていることが分かります。
$ python jwt-test.py
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjAwMSIsIm5hbWUiOiJoYWtreSIsImVtYWlsIjoiaGFra3lAZW1haWwuY29tIn0.AvLXzyxzX4Jy0rzDcHWWQeMC57N4dGqf6sXyYQOkyEg
{'id': '001', 'name': 'hakky', 'email': 'hakky@email.com'}
まとめ
PyJWT を使うと、簡単に URL セーフな文字列に変換することができます。情報の転送において、情報の秘匿は重要ですので、このようなツールを使って安全に行うべきです。
参考文献

備考
Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。
