JWT認証においてJWTをlocalStorageに保存する場合とCookieに保存する場合のセキュリティ強度の違い
2025/8/10
JWT認証 Cookie セキュリティ
localStorage保存
- 同一オリジン内ではJSによりlocalStorageにアクセスできるため、JSからJWTを参照できる
- なのでXSSによって悪意あるJSがJWTを攻撃者に流出するリスクがある
- CSRFにおいては、リクエスト時にJWTが自動的に送信されないため発生しない
Cookie保存
- httpOnly属性=trueでJSからcookieを参照できない
- secure属性=trueでhttpsの暗号化通信の時のみcookieを送信するよう制御できる
- なので、XSSによる被害は受けない
観点 | localStorage に保存 | Cookie に保存(HttpOnly; Secure; SameSite 前提) |
---|---|---|
XSS によるトークン窃取 | 弱い:JS で読み取り可。XSS発生=即流出 | 強い:HttpOnly で JS から読めない(ただし XSS 自体は別途対策必要) |
CSRF リスク | 低い:自動送信されないため原理的に起きにくい | 高い:自動送信されるため対策必須(SameSite /CSRFトークン) |
送信制御(CORS/ヘッダ) | しやすい:自分でAuthorization を付与 | しにくい:ブラウザが自動送信(CORSは応答側制御+credentials ) |
ブラウザ属性による防御 | なし(HttpOnly/SameSite 不可) | あり:HttpOnly /Secure /SameSite /__Host- で強化可 |
サブドメイン注入/固定化 | 該当しない | Domain 誤設定で影響拡大の恐れ → __Host- 推奨 |
参考
SPAのログイン認証のベストプラクティスがわからなかったのでわりと網羅的に研究してみた〜JWT or Session どっち?〜 - Qiita