セキュリティに特別な配慮が必要なサーバサイドアプリケーションは、ブラウザに対してCORSの一部としてAccess-Control-Allow-Headers
というアドバイスをします。これは、サーバサーイドでクロスオリジンサイトとして安全とアドバイスしたサイトに対し「但し、Access-Control-Allow-Headers
にあるヘッダーに限る」と制限をつけるものです。しかしながらヘッダーの性質上セキュリティに問題なりにくいヘッダについてはわざわざここにリストされていなくてもOKという取り決めがあります。これがCORSセーフリクエストヘッダーとなります。
セーフリクエストヘッダーには以下の4つが決められています。どれもおなじみのものですね。
- Accept
- Accept-Language
- Content-Language
- Content-Type
従って、通常これらのヘッダーがAccess-Control-Allow-Headers
にリストされる必要はありませんが、ややこしい事にこれらをAccess-Control-Allow-Headers
に追加されることで、追加制約が解除される
という仕様があります。
- Accept-LanguageとContent-Language:
0-9, A-Z, a-z, スペースまたは*,-.
が利用可能になる。 - Accept と Content-Type: CORS-unsafeのリクエストヘッダバイト:
0x00-0x1F (許可されている 0x09 (HT) を除く)、"():<>?@[\]{}、および 0x7F (DEL)
利用可能になる。 - Content-Typeの場合:
application/x-www-form-urlencoded、multipart/form-data、text/plain
のいずれかのMIMEタイプが利用可能になる。 - すべて:値の長さを128以上にすることができる。
覚えておいてもあまり使わなそうですね。ただ他人が書いたコードを読んでいてAccess-Control-Allow-Headers
にセーフリクエストヘッダーが入っているのを発見して安易に削除すると挙動が変わってしまうことがあるので注意しましょう。
ワイルドカードによる指定
Access-Control-Allow-Headers
はAccess-Control-Allow-Headers: *
のように、ワイルドカードによる指定が可能です。ただ一つ注意があってAuthorization
ヘッダはワイルドカードに含まれません。*
を使いたいけどさすがにAuthorization
を他サイトに送って欲しくないと言う心配は不要です。むしろ認証トークンの送信にAuthorization
以外のカスタムHTTPヘッダーを利用するのは止めた方がいいと言うことですね。