ブラウザ上の fetch でレスポンスヘッダにある Date が取得できない

Icon

70_10

ブラウザ上で fetch を実行し、レスポンスヘッダにある Date を取得したいとします。

コードでは以下のように書きました。実際に動かしてみると res.headers.get("Date") は null を返してきます。

const res = await fetch("https://example.com");
const date = res.headers.get("Date");

console.log(date); // => null

実際のリクエスト情報を見ると、たしかにレスポンスヘッダに Date は存在します。
なぜブラウザ上の fetch では取得できないか。それは CORS が関係しています。

CORS の仕組み上、クライアントからは一部のヘッダにしかアクセスできません。このアクセスを許可されているヘッダ群を CORS-safelisted Response Header (Simple Response Header) と呼びます。クライアントに公開しても安全であると考えられるヘッダで、常にクライアントからアクセスできます。

今回取得しようとた Date ヘッダは、CORS-safelisted Response Header に含まれていません。そのため null が返されました。

Date ヘッダをクライアントからアクセス可能にするには、 Access-Control-Expose-Headers ヘッダを使って登録します。
サーバー側で Access-Control-Expose-Headers: Date を設定することで、クライアントからの Date ヘッダのアクセスを許可できます。