CORSでのCookieと認証の設定
クロスオリジンCookieと認証ヘッダーをサポートするCORS設定。SameSite属性、Secureフラグ、認証情報の三者間ハンドシェイクを解説します。
Credentials
詳細な説明
認証情報の3つの要件
Cookieをクロスオリジンで送信するには、3つすべてが正しく設定されている必要があります。1つでも欠けるとCookieは暗黙的にドロップされます。
1. サーバー:Allow-Credentialsヘッダー
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Credentials: true
認証情報が有効な場合、オリジンは*にできません。
2. クライアント:credentialsフラグ
// Fetch API
fetch("https://api.example.com/data", {
credentials: "include",
});
// Axios
axios.get("https://api.example.com/data", {
withCredentials: true,
});
3. Cookie:SameSiteとSecure属性
Set-Cookie: session=abc123; SameSite=None; Secure; HttpOnly; Path=/
- クロスオリジンCookieには
SameSite=Noneが必須(Chrome 80以降)。 SameSite=Noneの場合Secureは必須。HttpOnlyはJavaScriptによるCookie読み取りを防止(セッショントークンに推奨)。
よくある失敗パターン
| 症状 | 原因 |
|---|---|
| Cookieが送信されない | クライアントにcredentials: "include"がない |
| Cookie送信されるがレスポンスがブロック | サーバーにAllow-Credentials: trueがない |
| Cookieがまったく設定されない | SameSiteがNoneに設定されていない、またはSecureフラグがない |
| 不透明レスポンス | オリジンが*で認証情報あり — ブラウザが暗黙的に拒否 |
デバッグ手順
- ネットワークタブで
Set-Cookieレスポンスヘッダーを確認。 - アプリケーション > CookieでCookieが保存されたか確認。
- 次のリクエストに
Cookieヘッダーが含まれていることを確認。 - CORSレスポンスに
Allow-Origin(特定)とAllow-Credentials: trueの両方が含まれていることを確認。
ユースケース
app.example.comのシングルページアプリケーションがapi.example.comのAPIに保存されたセッションCookieでユーザーを認証する必要があります。正しいCORSとCookie設定がないと、ログインエンドポイントはSet-Cookieヘッダーを返しますが、ブラウザが保存を拒否します。