PHPのJWT認証を完全ガイド!初心者でもわかるJSON Web Tokenの基本と安全な仕組み
生徒
「PHPでログイン機能を作っているのですが、最近よく聞くJWT認証ってどういうものなんですか?」
先生
「JWTはJSON Web Tokenと呼ばれる仕組みで、ログイン後のユーザーを安全に認証するための方法です。特にAPIでよく使われていますよ。」
生徒
「セッションを使った認証と何が違うんでしょうか?」
先生
「その違いも含めて、PHPで使われるJWTの基本から順番に説明していきましょう。」
1. JWT(JSON Web Token)とは?初心者向けに基礎から解説
JWTとは「JSON Web Token」の略で、ユーザーの認証情報を安全にやり取りするためのトークン(符号化されたデータ)のことです。JWTは文字の羅列のように見えますが、実際にはユーザーIDや発行時間などが記録されています。特徴は、サーバーでセッションを保持せずに認証できるという点です。
従来のPHPではセッションを使ってログイン管理を行うことが一般的でした。しかし、APIやスマホアプリ、複数のサーバーを使う環境では、セッション管理が難しくなる場面があります。そこで登場したのがJWTで、トークンをユーザー側に渡し、それを持っているかどうかで認証を行う仕組みになっています。
2. JWTはどのような構造になっているのか?3つの部分を理解しよう
JWTは「ヘッダー」「ペイロード」「署名」の3つの部分に分かれています。これらはピリオドで区切られており、短くても強力な認証データを作り上げています。
(1)ヘッダー:使用するアルゴリズムやトークンの種類を記述した部分
(2)ペイロード:ユーザーIDや有効期限などのデータが記録される部分
(3)署名:トークンが書き換えられていないかを確認するための安全な鍵
この3つを結合し暗号化することで、改ざんができない安全なトークンが生成されます。初心者の方は「中身が入った箱+鍵がついた状態」とイメージすると理解しやすいでしょう。
3. PHPでJWTを使う場面を理解しよう
PHPでJWTが使われる代表的な場面はAPI認証です。例えば、ログインが成功するとトークンを発行し、それを次のページやAPIリクエストごとに一緒に送ることで、ログイン状態を証明します。セッションのようにサーバー側で状態を保持しなくてもよいため、軽量で扱いやすいという特徴があります。
また、スマホアプリやJavaScriptで動くSPA(シングルページアプリケーション)でもJWTがよく使われます。つまり、PHPでAPIを作る際にJWTはほぼ必須の技術と言えるほど広く利用されているのです。
4. PHPでのJWT生成の流れを初心者向けに解説
JWTを発行する流れは非常にシンプルです。まずユーザーがログインフォームにメールアドレスとパスワードを入力します。その後、PHP側でパスワードが正しいと判定された場合にJWTを生成します。
JWTを生成するには、ヘッダーとペイロードをJSON形式で作り、Base64という形式に変換します。その後、秘密鍵を使って署名を生成し、それらを結合することでトークンが完成します。トークンは次のリクエストから送信され、認証の確認に使われます。
$header = base64_encode(json_encode(['alg' => 'HS256', 'typ' => 'JWT']));
$payload = base64_encode(json_encode(['user_id' => 1, 'exp' => time() + 3600]));
$signature = hash_hmac('sha256', $header . "." . $payload, 'secret_key', true);
$jwt = $header . "." . $payload . "." . base64_encode($signature);
5. トークンの検証方法と安全性の仕組み
JWTには署名が付いているため、トークンが改ざんされていないかチェックできます。例えば、攻撃者が自分のユーザーIDを偽装しようとしても、署名部分が一致しなくなるため不正なトークンだと判定されます。この仕組みによって、安全にユーザー認証が行えるのです。
トークンが有効期限内であるかをチェックすることも重要です。期限切れのトークンは無効となるため、再発行が必要になります。これにより、不正利用を防ぐことができます。
6. JWT認証で注意すべきセキュリティポイント
JWTは便利ですが、正しく扱わないとリスクもあります。特に次の点に注意する必要があります。
- 秘密鍵は絶対に漏らさない(署名が解読されると危険)
- HTTPS通信を必ず使用する(盗聴防止)
- トークンの有効期限を適切に設定する
- トークンを保存する場所に気をつける(ブラウザのlocalStorageなど)
APIを安全に運用するためには、これらの基本的なセキュリティ対策を知っておくことが欠かせません。PHPでJWTを利用する場合、仕組みそのものを理解しておくと、より安全で信頼できる認証機能が作れるようになります。