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

ファジープロジェクト対策 その2

前回に引き続き、大事だと思ったこと。一部単なるフレームワークの作り方的な内容になっているかも。 Contents1 テンプレート共通化2 バリデーション3 ログ出し4 異常系の処理5 新規プラグイン+ …

no image

コメントについて

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

no image

メモリに関して 静的領域、スタック、ヒープなど

実務でメモリの調査をしましたが、肝心のメモリについてほとんどわかっていないのでメモ。 メモリの領域を大きく分けると静的、スタック、ヒープに別れる。 Contents1 静的2 スタック3 ヒープ4 そ …

no image

設定ファイルの置き場所

一般的にレベルの高いソースとは保守性が高いものを指します。特にWEB系ですと仕様変更がしょっちゅうなので変更があったときにいかに少ない工数で対応できるかが大切です。 保守性をあげる工夫はいろいろありま …

no image

phing

今までphpunit,phpmd,phpcodesniffer,phpdocumentなどのツールをいろいろと試してきますが、個別に動かしていると大変面倒ですので、これを一気に行えるライブラリがありま …

アーカイブ