

S3 CORS設定の各要素とレスポンスヘッダーの対応関係
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
S3のCORS設定でハマったので、要素の対応関係を整理しておく。
設定要素とレスポンスヘッダーの対応
CORS設定の各要素は、実際のレスポンスヘッダーに次のように対応する。
| 設定要素 | レスポンスヘッダー | 備考 |
|---|---|---|
AllowedOrigin |
Access-Control-Allow-Origin |
* で全オリジン許可、特定オリジン指定も可 |
AllowedMethod |
Access-Control-Allow-Methods |
GET/PUT/POST/DELETE/HEADが指定可能 |
AllowedHeader |
Access-Control-Allow-Headers |
* で全ヘッダー許可も可 |
MaxAgeSeconds |
Access-Control-Max-Age |
プリフライト(OPTIONS)結果をブラウザがキャッシュする秒数 |
GETのみを許可する設定はこんな感じになる。
<?xml version="1.0" encoding="UTF-8"?><CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>Authorization</AllowedHeader> <AllowedHeader>Accept</AllowedHeader> <AllowedHeader>Content-Type</AllowedHeader> <AllowedHeader>Origin</AllowedHeader> </CORSRule></CORSConfiguration>読み取り専用で公開するバケットなら、こういう最小構成で十分。プリフライトが飛ぶリクエスト(カスタムヘッダー付きなど)を投げるなら、AllowedHeader に必要なヘッダーを足しておく必要がある。
AllowedOriginにnullを入れたくなる件
ブラウザは file:// からのリクエストやサンドボックス化されたiframeなどで、Origin: null というヘッダーを送ることがある。これに対応しようとして AllowedOrigin に null を追加したくなるケースがあるが、AWSの案内では非推奨とされている。
理由は単純で、null を許可リストに入れると、意図しない場所からのリクエスト(ローカルファイルを開いただけ、など)まで拾ってしまい、セキュリティ上のリスクになるから。「廃止された機能」というより「セキュリティ上入れるべきではない値」というニュアンスで理解しておくのが正確そう。
AllowedHeaderのワイルドカード
AllowedHeader は1つの文字列につき * を1つだけ含められる。たとえば x-amz-* と書けば、Amazon固有のヘッダーをまとめて許可できる。全部許可したいだけなら * 単体でよい。