term
JWT (JSON Web Token) の構造とステートレスな認証機構の完全解説
現代のWebアプリケーション、特にSPA(Single Page Application)やモバイルアプリのバックエンドAPIにおいて、ユーザーのログイン状態を管理するための標準的な技術として「JWT(ジョット)」が広く採用されています。
【従来のセッション管理との違い】
昔ながらのWebサイトでは、ユーザーがログインすると、サーバー側が「誰がログインしているか」のメモ(セッション)をメモリやデータベースに記録し、ブラウザにはそのメモの番号(Cookie)だけを渡していました。しかし、この方式はアクセスが爆発的に増えてサーバーを複数台に増やした際、「どのサーバーにメモがあるかわからなくなる」という弱点がありました。
JWTはこれを根本から覆す「ステートレス(状態を持たない)」な認証方式です。
【JWTの3つの構造】
JWTの文字列は、ドット(`.`)で区切られた3つのパーツで構成されています。
1. ヘッダー (Header)
使用している暗号化アルゴリズム(HS256やRS256など)や、トークンのタイプがJSON形式で記述され、Base64でエンコードされています。
2. ペイロード (Payload)
「ユーザーIDは123番」「管理者の権限を持っている」「有効期限は今日の23時まで」といった、アプリケーションで実際に使用するユーザー情報(クレーム)が含まれています。これもBase64でエンコードされています。注意点として、ペイロード部分は暗号化されておらず誰でも解読できるため、パスワードやクレジットカード番号などの機密情報を絶対に入れてはいけません。
3. シグネチャ (Signature)
ここがJWTの要です。ヘッダーとペイロードを組み合わせ、サーバーだけが知っている「秘密鍵」を使って生成されたハッシュ値です。もし悪意のあるユーザーがペイロードを「管理者権限を持っている」と改ざんして送信してきても、サーバーが再計算したシグネチャと一致しなくなるため、一瞬で不正を見抜くことができます。
【メリットとデメリット】
JWT最大のメリットは、サーバーがデータベースに問い合わせなくても、トークンのシグネチャを計算するだけで「正当なユーザーか」を判断できる点です。これによりサーバーの負荷が劇的に下がります。一方で、「有効期限が切れるまでサーバー側から強制的にトークンを無効化しにくい(ログアウト処理が難しい)」というデメリットもあり、リフレッシュトークンと組み合わせて運用するのが一般的です。