JWTについて調べてみました

PythonでWebアプリケーションを作ろうとしているのですが、
認証について知識がなかったので調べてみました。


*JWT(Json Web Token)とは

認証でログインしたとき、有効期限やユーザー名などを保持する目的で JWT が使われます。JWT は Claim(属性情報)を Json のデータ構造であらわしたトークンの仕様のことを言います。呼び方はジョットというそうです。鍵情報がなくても、改ざんできない URL に埋め込むことができるといった特徴があります。

構造としては、JWT は2つのピリオドで区切られた3種類の文字列で成り立っています。
最初から順番に、ヘッダー・ペイロード・署名になっています。
  • ヘッダー:署名の検証をするために必要な設定情報です。
  • ペイロード:属性情報です。任意のデータを格納することができます。
  • 署名:ヘッダーとペイロードを連結してエンコードした情報で、データが改ざんされているかチェックするために必要になります。


*JWTデバッガー

JWTの動きを確認するためのサイトです。
エンコードを即時にしてくれるので便利です。


実際に使ってみました。
まずヘッダーのalgは署名アルゴリズム、typはJWTであることを指しています。
{
  "alg": "HS256",
  "typ": "JWT"
}

ペイロードは任意のデータを入れることができます。
デフォルトの値から少し変えてみました。
{
  "sub": "223344",
  "name": "Mogu Mogu",
  "admin": true
}

署名は自動で作成されます。
ヘッダーとペイロードを入れると、Encodeの欄に結果を出力してくれます。


*コードでの使い方

PythonでJWTを使ってみました。
GitHubに使い方の手順が載っています。

インストールします。
$ pip install python-jose

Pythonファイルを作成し、jwt をインポートして使います。
from jose import jwt

token = jwt.encode({'key': 'value'}, 'secret', algorithm='HS256')
print(token)


エンコードした結果を出力すると、下記文字列を取得することができました。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ2YWx1ZSJ9.FG-8UppwHaFp1LgRYQQeS6EDQF7_6-bMFegNucHjmWg


今度はデコードをして、元の値を取得してみました。
jwt.decode(token, 'secret', algorithms=['HS256'])
{u'key': u'value'}


*所感

今までの業務では既に作られているWebアプリケーションの改修しか担当したことがなかったので、認証部分について触る機会がなく、詳しい理解をしていませんでした。
Webアプリケーションを作成する際は、この理解したことを生かしていきたいと思います。