skillup

技術ブログ

プログラミング全般

JWT(ジョット)の認証に関して

投稿日:2021年1月17日 更新日:

セッションやtokenを使った、認証について色々書いてきましたが、今回はJWTを使った認証について。

以前の認証がらみの記事

ログインしたままにするの挙動に関して(ステートフル認証の基本的な仕組みの復習もかねて)

トークン認証に関して

JWT(ジョット)とは?

Json Web Tokenの略で、Json形式をした認証情報を加工してtokenとして認識させる認証システムのことになります。ちなみに読み方はジョットのようです。

大きく分けると下記の3つの情報が含まれています。

ヘッダー

認証アルゴリズムやtoken情報などのメタ情報を含む要素。

デコードすると下記のようなデータになります。

クレーム情報(ペイロードとも言います。)

Body的な要はユーザーの認証情報を含む要素です。例として、下記のようにユーザーID,パスワードなどを含んだものが多いです。

署名

暗号化のアルゴリズムを使い、ヘッダー、ピリオド、エンコード済みペイロード、ピリオドを連結したものに文字通り、署名を行い、Base64Urlエンコードを行います。

実際には以下のような文字列になります。ピリオドが2箇所ありますが、これがヘッダーとペイロード、署名の区切りになっています。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

下記のURLで実際の暗号化を行うことができます。

https://jwt.io/

また下記のサイトでは1プロセスずつの紹介もしています。

JSON Web Tokenによる認証

メリット

  • 署名が含まれているため、改ざんがあってもチェックできる
  • 有効期限をつけるなどセキュアなtoken発行が楽にできる
  • URLに含めることができるため、取り扱いが楽
  • 認証状をサーバー側で持つ必要がない
  • 任意のデータをトークンに含めることができる
  • 署名アルゴリズムを選択可能
  • (token方式自体のメリットですが)セッションをサーバー側で管理しなくて良いので、スケールアウトが簡単
  • tokenを発行するサーバーと認証をするサーバーを別々にできる(Oauthの特徴。)

デメリット

  • 署名のアルゴリズムでnone(なし)が選択でき、これが改ざんされる可能性がある
  • JWTをlocalStorageで保存する場合、JavaScriptなどでぬきとられる可能性がある

基本的なプログラムの流れ

サンプルソース

https://github.com/umanari145/phptips/tree/master/jwt

  1. ログイン画面などでUSER_ID,PASSWORDなどを使った認証ロジックにアクセス
  2. JWTの認証ロジックにより、tokenが有効時間付きで変換される
  3. tokenはCookieかWebStorageに保存しておく
  4. ログイン後の画面では発行されたtokenを必ず含んで、アクセスを行う

上記の1〜2にあたる部分がサンプルソースのlogin.php、4にあたる部分がdata.phpになります。

参考リンク

JWT(JSON Web Token)の「仕組み」と「注意点」

JSON Web Token(JWT)の紹介とYahoo! JAPANにおけるJWTの活用

JWTは使うべきではない 〜 SPAにおける本当にセキュアな認証方式 〜

PHP による単純な JWT 認証の例

↑サンプルソースはほぼここのものを流用させていただきました。

-プログラミング全般
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

コードレビュー時のポイント

コードレビュー(仕様的な点ではなくて規約的なところのチェック)などで気をつけることなど。 ポイントとしては検知ツールで確認するコストを減らすことが一番大事(カスタマイズの方法について調べておく)、ある …

no image

ポート解放(CentOS7)

新サーバー構築をしていたときにwebサーバーとしてnginxを立てましたが、外部から接続ができません。 500エラーすら吐かれず、ログも残っていません。 こんな時はホスト自体にアクセスが届いていない可 …

no image

Encypter、Decrypeterについて

独自の鍵を使ってencrypt,decrptメソッドを実装したので、メモを。 Contents1 参考ソース2 encrypt,decrptの内部について3 base64エンコーディングについて 参考 …

no image

制御フローについて

リーダブルコード 7章。制御フロー(if文などの条件分岐)について ここらへんは個人個人癖がついているとおもいますが、確かに読みやすい、読みにくいというのはあるのでなるべく汎用性のある規則を身につけた …

no image

テスト項目の作り方(縦項目について)

テスト項目の作り方について。 単体テスト書のレビューをしていて、なるべく効率的に網羅的にできるテスト仕様書の作成について。 納品物としてではなく、開発の高速化と品質をあげるためのテスト仕様書を。 Co …

アーカイブ