PHPのJWT認証の基本とは?初心者でもわかるJSON Web Tokenの使い方
生徒
「ログインしたユーザーの情報をPHPで安全に管理したいんですが、何か方法はありますか?」
先生
「それなら“JWT(ジェイ・ダブリュー・ティー)認証”を使う方法がありますよ。JSON Web Tokenという仕組みです。」
生徒
「なんだか難しそうな名前ですね……どういう仕組みなんですか?」
先生
「イメージしやすく説明していくので、安心してください。まずはJWTの基本から見ていきましょう!」
1. JWT(JSON Web Token)とは?
JWTとは「ジェイ・ダブリュー・ティー」と読み、「JSON Web Token(ジェイソン・ウェブ・トークン)」の略です。Webアプリケーションでユーザーの認証情報を安全にやりとりするための仕組みです。
簡単に言うと、「本人確認ができた印(しるし)」をコンパクトな文字列にして、ユーザーに持たせておく方法です。
例えば、映画館で一度チケットを買ったら、途中で外に出てもチケットを見せればまた入れますよね。あのチケットのような役割をするのがJWTです。
2. なぜPHPでJWTを使うのか?
PHPでWebサービスを作るとき、セッションを使ってログイン状態を管理するのが一般的ですが、API(エーピーアイ)など外部からのアクセスが増えるとセッション管理が難しくなります。
そこで活躍するのがJWTです。セッションを使わずに、ユーザーの認証状態をトークンとして保持でき、サーバー側に保存しておく必要がありません。
つまり、PHPでも「セッションレス」でユーザー管理ができる仕組みとして、JWTが注目されています。
3. JWTの構成は3つのパート
JWTは次の3つの部分で構成されます。
- ① ヘッダー(Header)
- ② ペイロード(Payload)
- ③ 署名(Signature)
ヘッダーには「これはJWTですよ」という情報、ペイロードには「ユーザーIDや有効期限」などのデータ、署名にはそれらが改ざんされていないかのチェック情報が入ります。
すべてが1本の長い文字列になっており、例えばこんな見た目になります:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjM0LCJleHAiOjE3MDAwMDAwMDB9.sXsi8x9L3x9H1xFf8xXk8-abc123XYZ
4. PHPでJWTを使うためのライブラリ
JWTの処理をPHPで一から書くのは大変なので、専用のライブラリを使うのが一般的です。もっともよく使われているのは「firebase/php-jwt」というライブラリです。
これはComposerというパッケージ管理ツールを使ってインストールできます。
composer require firebase/php-jwt
初心者の方は少し難しく感じるかもしれませんが、「必要な機能をあらかじめ用意してくれている便利セット」と考えておけばOKです。
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を使って認証チェックする方法
トークンを受け取ったら、今度はそれが正しいかどうかチェックします。これが認証処理です。
<?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認証のメリットと注意点
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の重要性も理解できました。今度は実際にログイン機能と組み合わせて使ってみます!」
先生
「いいですね。実際に手を動かして実装することで、理解がさらに深まりますよ。ぜひチャレンジしてみてください!」