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

コメントについて

リーダブルコード 第5・6章はコメントについて。 今回はコメントです。ここは結構賛否両論になるところではないかと思います。 ざっくり分けると「できるだけコメントは詳しく書くこと」という意見と「コメント …

no image

ログのまとめに関して

何回か書いたログの設計方針に関して再度復習。 ログ設計指針について ログで大事なことを再度復習 DEBUG(SQLやパラメータ情報など詳細な情報までだす)、INFO(メソッドの詳細情報、開始と終了)、 …

no image

コーディングについての気づき

現在の現場でコーディング関連で勉強になっているポイントについてまとめてみようかと思います。 Contents1 自動化2 命名3 責務の分離4 その他 自動化 規約エラーなどなるべく自動化できるものは …

no image

短いコードを書く

私が普段コードを書くときに考えていることは常にいかに短くかけるか、ということといかにバグを生み出さないかということです。 基本的にはできるだけ、短くシンプルに書くようにしています。 そうすることであと …

no image

例外処理に関して

いまいち使い方がいい加減だった例外処理について、復習がてらメモします。 昔のリンクを整理して出てきた例外リンクはこちら(Javaですが今のPHPにも当てはまるかと思います。) 例外処理について 例外処 …

アーカイブ