セッションやtokenを使った、認証について色々書いてきましたが、今回はJWTを使った認証について。
Contents
以前の認証がらみの記事
ログインしたままにするの挙動に関して(ステートフル認証の基本的な仕組みの復習もかねて)
JWT(ジョット)とは?
Json Web Tokenの略で、Json形式をした認証情報を加工してtokenとして認識させる認証システムのことになります。ちなみに読み方はジョットのようです。
大きく分けると下記の3つの情報が含まれています。
ヘッダー
認証アルゴリズムやtoken情報などのメタ情報を含む要素。
デコードすると下記のようなデータになります。
1 2 3 4 |
{ "typ": "JWT", "alg": "HS256" } |
クレーム情報(ペイロードとも言います。)
Body的な要はユーザーの認証情報を含む要素です。例として、下記のようにユーザーID,パスワードなどを含んだものが多いです。
1 2 3 4 5 |
{ "admin": true, "name": "John Doe", "sub": "1234567890" } |
署名
暗号化のアルゴリズムを使い、ヘッダー、ピリオド、エンコード済みペイロード、ピリオドを連結したものに文字通り、署名を行い、Base64Urlエンコードを行います。
実際には以下のような文字列になります。ピリオドが2箇所ありますが、これがヘッダーとペイロード、署名の区切りになっています。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
下記のURLで実際の暗号化を行うことができます。
また下記のサイトでは1プロセスずつの紹介もしています。
メリット
- 署名が含まれているため、改ざんがあってもチェックできる
- 有効期限をつけるなどセキュアなtoken発行が楽にできる
- URLに含めることができるため、取り扱いが楽
- 認証状をサーバー側で持つ必要がない
- 任意のデータをトークンに含めることができる
- 署名アルゴリズムを選択可能
- (token方式自体のメリットですが)セッションをサーバー側で管理しなくて良いので、スケールアウトが簡単
- tokenを発行するサーバーと認証をするサーバーを別々にできる(Oauthの特徴。)
デメリット
- 署名のアルゴリズムでnone(なし)が選択でき、これが改ざんされる可能性がある
- JWTをlocalStorageで保存する場合、JavaScriptなどでぬきとられる可能性がある
基本的なプログラムの流れ
サンプルソース
https://github.com/umanari145/phptips/tree/master/jwt
- ログイン画面などでUSER_ID,PASSWORDなどを使った認証ロジックにアクセス
- JWTの認証ロジックにより、tokenが有効時間付きで変換される
- tokenはCookieかWebStorageに保存しておく
- ログイン後の画面では発行されたtokenを必ず含んで、アクセスを行う
上記の1〜2にあたる部分がサンプルソースのlogin.php、4にあたる部分がdata.phpになります。
参考リンク
JWT(JSON Web Token)の「仕組み」と「注意点」
JSON Web Token(JWT)の紹介とYahoo! JAPANにおけるJWTの活用
JWTは使うべきではない 〜 SPAにおける本当にセキュアな認証方式 〜
↑サンプルソースはほぼここのものを流用させていただきました。