【入門編】JWTの有効期限(exp)とリフレッシュトークンの安全な運用 – アプリケーションセキュリティ & 安全な開発防御ガイド

ログインしたままの「魔法の鍵」をどう守る?JWTとトークン管理の鉄則

こんにちは。セキュリティの世界へようこそ。今日は、皆さんがWebサービスを作る際に必ずと言っていいほど直面する「認証」の仕組み、特に「JWT(JSON Web Token)」の守り方についてお話しします。

「JWTって何?」という方のために、まずは身近な例えから始めましょう。

JWTは「ホテルのカードキー」と同じです

皆さんがホテルに泊まる時、フロントでカードキーをもらいますよね。そのカードキーには「部屋番号」や「滞在期限」が書き込まれています。いちいちフロントで身分証を出さなくても、そのカードをドアにかざすだけで入室できます。

Webの世界でのJWTも同じです。一度ログインすると「この人は〇〇さんで、有効期限はあと1時間」という情報が書かれた「デジタルなカードキー」が発行され、ブラウザに保存されます。

しかし、この鍵を泥棒に盗まれたらどうなるでしょう? 犯人は皆さんのフリをして、あなたの個人情報を自由に見ることができてしまいます。今日は、この「鍵」を盗まれた時の被害を最小限にするための、プロの知恵を伝授します。

—

1. 「短命なアクセストークン」という防犯対策

ホテルのカードキーに「チェックアウト時刻」が印字されているように、JWTにもexp(有効期限)という項目があります。

ここで重要なのは、「アクセストークンは、短命であればあるほど良い」という原則です。例えば、有効期限を「1時間」に設定しておけば、万が一鍵が盗まれても、最大1時間でその鍵は無効になります。

コード例:JWTの生成(Node.js/jsonwebtokenライブラリ)

const jwt = require(‘jsonwebtoken’);

// 鍵を発行する関数
function generateAccessToken(user) {
// expiresIn を ’15m’(15分)など短く設定するのが鉄則です
return jwt.sign({ userId: user.id }, process.env.ACCESS_TOKEN_SECRET, { expiresIn: ’15m’ });
}

—

2. 「リフレッシュトークン」で快適さを維持する

「でも、15分ごとにログインし直すのは面倒くさいですよね?」と、皆さんは思うはずです。そこで登場するのが「リフレッシュトークン」です。

これは、「メインの鍵(アクセストークン)が切れたら、この予備の鍵(リフレッシュトークン)を見せて新しいメインの鍵をもらってきてね」という、いわば「マスターキー」のような存在です。

このリフレッシュトークンは、サーバー側のデータベースにも記録しておき、「誰が今どの鍵を持っているか」をサーバーが管理できるようにします。

—

3. 「ローテーション戦略」で泥棒を追い出す

さらにセキュリティを高める工夫が「トークン・ローテーション」です。これは、リフレッシュトークンを使って新しいアクセストークンを発行するたびに、「リフレッシュトークン自体も新しいものに交換する」という作戦です。

もし泥棒が古いリフレッシュトークンを使おうとしたら、「あれ?この鍵はもう交換済みだよ。おかしいな……」とサーバーが気づき、その一連のトークン群を強制的に無効化(ブラックリスト入り)させることができます。これで、被害を未然に防げるんです。

—

4. 忘れてはいけない「XSS」という名の侵入経路

さて、どんなに鍵を厳重に管理しても、泥棒が家の窓(ブラウザ)から侵入してくれば意味がありません。それがXSS(クロスサイトスクリプティング)です。

悪意のあるスクリプトを仕込まれると、JavaScriptからあなたの保存したJWTを盗み出されてしまいます。これを防ぐための「最強の門番」が、HTTPヘッダーの設定です。

セキュリティを守るための設定(Nginxやサーバー設定)

ブラウザに対して、「JavaScriptからはこの鍵に触らせないで!」と命令する設定です。

Set-Cookie ヘッダーの設定例
HttpOnly: JavaScriptからのアクセスを禁止(XSS対策の要)
Secure: HTTPS通信時のみ送信
SameSite=Strict: 別のサイトからの攻撃を防ぐ
Set-Cookie: refreshToken=your_token_value; HttpOnly; Secure; SameSite=Strict;

  • HttpOnly: これを付けるだけで、JavaScriptがトークンを読み取れなくなります。泥棒が侵入しても、鍵が金庫(ブラウザの保護領域)の中にあるため、持ち出せなくなるのです。

—

まとめ:一歩ずつ、確実に

セキュリティ対策に「完璧」はありませんが、リスクを減らすことはできます。

1. アクセストークンは短命に(expを短く設定)。
2. リフレッシュトークンで使い回しを防ぐ(ローテーションの実装)。
3. トークンは HttpOnly クッキーで守る(XSSからの保護)。

まずは今日、皆さんのアプリケーションのトークン有効期限がどれくらいか、HttpOnly属性が付いているかを確認することから始めてみてください。

セキュリティは、派手な防御魔法ではなく、こうした「泥臭い積み重ね」が一番の武器になります。一緒に、安全で信頼されるWebの世界を作っていきましょう!

コメント

タイトルとURLをコピーしました