カテゴリ: PHP 更新日: 2026/06/05

PHPのJWT認証の基本とは?初心者でもわかるJSON Web Tokenの使い方

PHP の JWT(JSON Web Token)認証の基本
PHP の JWT(JSON Web Token)認証の基本

先生と生徒の会話形式で理解しよう

生徒

「ログインしたユーザーの情報をPHPで安全に管理したいんですが、何か方法はありますか?」

先生

「それなら“JWT(ジェイ・ダブリュー・ティー)認証”を使う方法がありますよ。JSON Web Tokenという仕組みです。」

生徒

「なんだか難しそうな名前ですね……どういう仕組みなんですか?」

先生

「イメージしやすく説明していくので、安心してください。まずはJWTの基本から見ていきましょう!」

1. JWT(JSON Web Token)とは?

1. JWT(JSON Web Token)とは?
1. JWT(JSON Web Token)とは?

JWTとは「ジェイ・ダブリュー・ティー」と読み、「JSON Web Token(ジェイソン・ウェブ・トークン)」の略です。Webアプリケーションでユーザーの認証情報を安全にやりとりするための仕組みです。

簡単に言うと、「本人確認ができた印(しるし)」をコンパクトな文字列にして、ユーザーに持たせておく方法です。

例えば、映画館で一度チケットを買ったら、途中で外に出てもチケットを見せればまた入れますよね。あのチケットのような役割をするのがJWTです。

2. なぜPHPでJWTを使うのか?

2. なぜPHPでJWTを使うのか?
2. なぜPHPでJWTを使うのか?

PHPでWebサービスを作るとき、セッションを使ってログイン状態を管理するのが一般的ですが、API(エーピーアイ)など外部からのアクセスが増えるとセッション管理が難しくなります。

そこで活躍するのがJWTです。セッションを使わずに、ユーザーの認証状態をトークンとして保持でき、サーバー側に保存しておく必要がありません。

つまり、PHPでも「セッションレス」でユーザー管理ができる仕組みとして、JWTが注目されています。

3. JWTの構成は3つのパート

3. JWTの構成は3つのパート
3. JWTの構成は3つのパート

JWTは次の3つの部分で構成されます。

  • ① ヘッダー(Header)
  • ② ペイロード(Payload)
  • ③ 署名(Signature)

ヘッダーには「これはJWTですよ」という情報、ペイロードには「ユーザーIDや有効期限」などのデータ、署名にはそれらが改ざんされていないかのチェック情報が入ります。

すべてが1本の長い文字列になっており、例えばこんな見た目になります:


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjM0LCJleHAiOjE3MDAwMDAwMDB9.sXsi8x9L3x9H1xFf8xXk8-abc123XYZ

4. PHPでJWTを使うためのライブラリ

4. PHPでJWTを使うためのライブラリ
4. PHPでJWTを使うためのライブラリ

JWTの処理をPHPで一から書くのは大変なので、専用のライブラリを使うのが一般的です。もっともよく使われているのは「firebase/php-jwt」というライブラリです。

これはComposerというパッケージ管理ツールを使ってインストールできます。


composer require firebase/php-jwt

初心者の方は少し難しく感じるかもしれませんが、「必要な機能をあらかじめ用意してくれている便利セット」と考えておけばOKです。

5. JWTをPHPで発行してみよう(サンプルコード)

5. JWTをPHPで発行してみよう(サンプルコード)
5. JWTをPHPで発行してみよう(サンプルコード)

ログイン成功後にJWTを作る方法の例です。ユーザーIDをトークンに含めて発行します。


<?php
use Firebase\JWT\JWT;

$key = "secret_key";
$payload = [
    "user_id" => 1234,
    "exp" => time() + 3600
];

$jwt = JWT::encode($payload, $key, 'HS256');
echo $jwt;
?>

expは有効期限で、1時間後(3600秒)に設定しています。これで安全にユーザー情報をトークンとして渡せます。

6. JWTを使って認証チェックする方法

6. JWTを使って認証チェックする方法
6. JWTを使って認証チェックする方法

トークンを受け取ったら、今度はそれが正しいかどうかチェックします。これが認証処理です。


<?php
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

$jwt = $_GET['token']; // 例:URLにtokenが付いている
$key = "secret_key";

try {
    $decoded = JWT::decode($jwt, new Key($key, 'HS256'));
    echo "ユーザーID:" . $decoded->user_id;
} catch (Exception $e) {
    echo "トークンが無効です";
}
?>

トークンが正しければユーザーIDなどの情報が取り出せます。もし偽物や期限切れのトークンならエラーになります。

7. JWT認証のメリットと注意点

7. JWT認証のメリットと注意点
7. JWT認証のメリットと注意点

JWT認証には次のようなメリットがあります:

  • ・セッションが不要でAPIと相性が良い
  • ・トークンを渡すだけで認証が完了する
  • ・パスワードなどの機密情報を毎回送らなくて済む

一方で、注意点もあります:

  • ・トークンは改ざんできないが、盗まれると悪用される
  • ・HTTPS(暗号化通信)で安全にやりとりすることが必須
  • ・トークンは定期的に更新・失効する仕組みが必要

このように、正しく使えば便利で安全な方法ですが、最低限のルールを守ることが重要です。

まとめ

まとめ
まとめ

JWT認証の基本を振り返る

PHPでのJWT認証は、これからのWebアプリケーション開発において非常に重要な技術です。特にAPI開発やモダンなフロントエンドとの連携を考えると、セッション管理に依存しない「トークンベース認証」は避けて通れません。 本記事で解説したように、JWT(JSON Web Token)は「ヘッダー」「ペイロード」「署名」の3つで構成され、ユーザー情報とその正当性を1つのトークンとしてまとめて扱うことができます。

従来のPHPのセッション管理では、サーバー側に状態を持つ必要がありましたが、JWTを使うことで「ステートレス(状態を持たない)」な設計が可能になります。これにより、スケーラブルなシステム構築やマイクロサービスとの相性が非常に良くなります。

JWTの仕組みと実装ポイント

JWTの最大の特徴は、改ざん検知ができる点です。署名(Signature)によってトークンの整合性が保たれているため、不正に内容を書き換えることができません。 PHPでは「firebase/php-jwt」ライブラリを使うことで、複雑な暗号処理を簡単に扱うことができます。


<?php
use Firebase\JWT\JWT;

$key = "secret_key";
$payload = [
    "user_id" => 1234,
    "exp" => time() + 3600
];

$jwt = JWT::encode($payload, $key, 'HS256');
echo $jwt;
?>

上記のように、ユーザーIDや有効期限をペイロードに含めることで、ログイン状態を安全に管理できます。また、認証時にはトークンを検証し、正当なユーザーかどうかを判断します。


<?php
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

$jwt = $_GET['token'];
$key = "secret_key";

try {
    $decoded = JWT::decode($jwt, new Key($key, 'HS256'));
    echo "ユーザーID:" . $decoded->user_id;
} catch (Exception $e) {
    echo "トークンが無効です";
}
?>

JWT認証を使う際の重要な注意点

JWTは非常に便利ですが、正しく使わなければセキュリティリスクにもなります。特に重要なのは以下のポイントです。

  • HTTPS通信を必ず使用すること
  • トークンの有効期限(exp)を適切に設定すること
  • 秘密鍵(secret_key)を厳重に管理すること
  • 必要に応じてリフレッシュトークンを導入すること

また、JWTは「改ざんは防げるが盗難は防げない」という特徴があります。そのため、トークンの保存場所(LocalStorageやCookie)や送信方法にも注意が必要です。

PHP×JWTの活用シーン

JWTは以下のような場面で特に活躍します。

  • SPA(シングルページアプリケーション)との連携
  • モバイルアプリとAPI通信
  • マイクロサービス間の認証
  • 外部サービスとのセキュアなデータ連携

これらの場面では、セッションよりもJWTの方が柔軟で拡張性の高い設計が可能です。PHPでAPIを構築する際には、JWT認証はほぼ必須の知識と言えるでしょう。

先生と生徒の振り返り会話

生徒

「JWTって最初は難しそうでしたけど、仕組みを分けて考えると意外とシンプルですね。特にヘッダー・ペイロード・署名の3つに分かれているのが理解しやすかったです。」

先生

「そうですね。構造を理解すると、一気にハードルが下がります。PHPではライブラリを使えば簡単に扱えるので、実務でも導入しやすいのが魅力です。」

生徒

「セッションを使わずにログイン状態を管理できるのも便利ですね。API開発では特に役立ちそうです。」

先生

「その通りです。これからのWeb開発ではAPI中心の設計が主流なので、JWTはしっかり押さえておきたい技術です。ただしセキュリティには常に注意してください。」

生徒

「はい!トークンの期限やHTTPSの重要性も理解できました。今度は実際にログイン機能と組み合わせて使ってみます!」

先生

「いいですね。実際に手を動かして実装することで、理解がさらに深まりますよ。ぜひチャレンジしてみてください!」

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

PHP のセッション管理の記事一覧へ
新着記事
New1
Python
Pythonの整数と浮動小数点数の違いとは?数値型の基本を解説
New2
Python
Pythonで文字列をリストに変換する方法!split()とjoin()の使い方
New3
Python
Pythonのbreakとcontinueの違いとは?ループの制御方法をマスター
New4
Python
Pythonのstartswith()・endswith()の使い方!文字列の前後をチェック
人気記事
No.1
Java&Spring記事人気No1
PHP
PHPの特殊文字とエスケープ処理を完全ガイド!初心者向けにhtmlspecialcharsとhtmlentitiesをやさしく解説
No.2
Java&Spring記事人気No2
PHP
PHP の文字列のフォーマット(sprintf, printf)
No.3
Java&Spring記事人気No3
Python
Pythonで文字列を置換する方法!replace()の使い方と正規表現の活用
No.4
Java&Spring記事人気No4
Python
Pythonのクロージャー(Closure)とは?関数内関数とnonlocalの活用
No.5
Java&Spring記事人気No5
Python
Pythonでリストを分割する方法(スライス / split() / itertools)
No.6
Java&Spring記事人気No6
Python
Pythonで経過時間を測る方法をやさしく解説!初心者向けtime.perf_counterとtime.sleepの使い方
No.7
Java&Spring記事人気No7
Python
Pythonのstartswith()・endswith()の使い方!文字列の前後をチェック
No.8
Java&Spring記事人気No8
PHP
PHPの認証機能を実装する方法!初心者でもわかるログイン・ログアウト処理の基本