認証について知識がなかったので調べてみました。
*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アプリケーションを作成する際は、この理解したことを生かしていきたいと思います。