Cookie の Secure・HttpOnly・SameSite 属性の設定方法
執筆:IDEAVALU運営 · 更新:
ログイン状態を保つ Cookie が盗まれると、パスワードがなくてもその人として操作されます。3つの属性で、盗まれる経路を減らせます。
3つの属性の役割
それぞれ、防ぐ経路が違います。
- Secure:暗号化された HTTPS の通信でだけ Cookie を送ります。
- HttpOnly:JavaScript から Cookie を読めなくします。XSS が起きても Cookie を盗まれにくくなります。
- SameSite:他のサイトから送られたリクエストに Cookie を付けるかを決めます。Lax にすると、他サイトからのフォーム送信などに Cookie が付かず、CSRF を防ぎやすくなります。
自分で確認する方法
ブラウザの開発者ツールの「Application」(Firefox は「ストレージ」)→ Cookies で、各 Cookie の Secure・HttpOnly・SameSite の列を確認できます。curl なら Set-Cookie ヘッダーを表示します。
Set-Cookie を表示する
curl -sI https://example.com | grep -i set-cookie
直し方
Cookieの属性
Cookie に Secure・HttpOnly・SameSite を付けます。
Next.js(Route Handler / Server Action)の場合
const cookieStore = await cookies()
cookieStore.set('session', value, {
secure: true,
httpOnly: true,
sameSite: 'lax',
path: '/',
})JavaScript から読む必要がある Cookie(表示設定など)以外は HttpOnly にしてください。ログイン用のトークンを localStorage や HttpOnly なしの Cookie に置くと、XSS で盗まれます。
よくある質問
- ログイン用のトークンを localStorage に保存してもよいですか?
- localStorage は JavaScript から読めるため、XSS が起きると盗まれます。可能なら HttpOnly の Cookie に保存してください。Supabase など、認証ライブラリの推奨する保存方法にも従ってください。