導入:なぜcredentialsの設定が重要なのか
Web開発において、認証が必要なAPIを叩く際、「なぜかクッキーが送信されない」「CORSエラーで弾かれる」といったトラブルに遭遇したことはありませんか?その原因の多くは、Fetch APIのデフォルト設定にあります。ブラウザのFetch APIでは、セキュリティ上の理由からデフォルトでは認証情報(CookieやHTTP認証)が送信されません。この挙動を制御し、安全かつ適切に認証情報を扱うために不可欠なプロパティが「Request.prototype.credentials」です。
基礎知識:credentialsプロパティとは
Request.prototype.credentialsは、Fetchリクエストにおいて、クロスオリジン(ドメインを跨ぐ通信)の際に認証情報を含めるかどうかを指定するプロパティです。設定可能な値は主に以下の3つです。
omit: 常に認証情報(Cookieなど)を送信しません(デフォルト値)。
same-origin: リクエスト先が同じオリジンの場合のみ、認証情報を送信します。
include: リクエスト先がクロスオリジンであっても、常に認証情報を送信します。
※注意点として、includeを設定する場合、サーバー側でCORSの許可設定(Access-Control-Allow-Credentials: true)が正しく行われている必要があります。
実装:Requestオブジェクトでの設定手順
Fetch APIを使用する際、Requestコンストラクタの第二引数にオプションとして指定します。これにより、リクエストの挙動を厳密に定義できます。
サンプルプログラム:認証情報を含めたFetchの実装例
// 認証情報を含めたリクエストのサンプルコード
async function fetchWithCredentials(url) {
try {
// Requestオブジェクトを作成し、credentialsを設定
const request = new Request(url, {
method: 'GET',
// 'include'を指定することで、クロスオリジンでもCookieを送信可能にする
credentials: 'include',
headers: {
'Content-Type': 'application/json'
}
});
const response = await fetch(request);
if (!response.ok) {
throw new Error(`HTTPエラー: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('通信に失敗しました:', error);
}
}
// 実行例
fetchWithCredentials('https://api.example.com/user-data');
応用・注意点:現場でハマりやすい罠
実務でこの設定を扱う際、特に注意すべき点が2つあります。
1. CORSプリフライトリクエストとの兼ね合い
credentialsを’include’に設定すると、ブラウザはより厳格なチェックを行います。サーバー側のレスポンスヘッダーで「Access-Control-Allow-Origin」が「(ワイルドカード)」になっていると、ブラウザはセキュリティエラーを吐いて通信を拒否します。必ず特定のドメインを明示的に指定するようにサーバーサイドを調整してください。
2. セキュリティリスクの理解
‘include’を乱用すると、クロスサイトリクエストフォージェリ(CSRF)攻撃に対して脆弱になる可能性があります。必要なAPIにのみ設定を適用し、不必要なクロスオリジン通信ではデフォルトの’omit’や’same-origin’を維持するのが鉄則です。
認証情報の扱いはフロントエンド開発の基本ですが、正しく理解していないとデバッグに時間を浪費しがちです。本記事を参考に、プロジェクトの要件に合わせて適切にcredentialsを設定してみてください。