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

APIに関して

RESTAPIのルーティングで気をつけることなんぞを。 直近のプロジェクトではRESTAPIを作ることが多かったんですが気をつけることなんぞを。 Contents1 仕様書はソースから2 ツール3 命 …

no image

サロゲートキーと主キーに関して

今までも何度か触れたサロゲートキーと主キーに関して。 今までの参考リンク 論理設計のグレーノウハウ サロゲートキー サロゲートキーに関して 主にシステム設計的な考察が多かったので、今回はユースケースか …

no image

調査スキルについて

本日は実務でとても大切な不具合の発見方法について 通常のプログラマとして仕事をしておりますと、通常の実装よりは不具合時の調査のほうが難しいことが多々あります。 もちろんものによるんですが、経験のある人 …

no image

1度に1つのことを

今回のリーダブルコードの概念はやや抽象的。 要は一度に行うタスクは1つにする、というところがポイントになります。 そのための手法として下記のようなことを上げています。 コードが行っているタスクをすべて …

no image

オブジェクト指向 ドメインモデル

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日は主にドメインモデルの考え方について。 Contents1 ドメインモデルの考え方1.1 要点1.2 感想 ドメインモデルの考え …