DjangoをCloudfrontの後ろに置く
S3からホスティングして、 /api 以下へのリクエストだけDjangoに流したい。
Django 5.1時点。
CSRFエラーがおきる。
OriginとHostヘッダが一致しないといけない。
Originは protocol/host/port のレベルで一致する必要がある。
リバースプロキシがHostヘッダを書き換えることで
また、今回はcloudfront←→ Origin間の通信はHTTPにしたので、protocol / portも一致しない。
CSRF_TRUSTED_ORIGINを指定することによっても回避できる。
X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Proto を用いて、正しい情報をバックエンドに伝えるのが一般的。
Cloudfront側の設定
X-Forwarded-Host, X-Forwarded-Port → Cloudfornt functionsを活用
viewer-requestにて書き換える。
オリジンにヘッダを転送する設定を忘れないように。
X-Forwarded-Proto → Cloudfront-Forwarded-Proto を活用
Cloudfront側が勝手に設定してくれる
オリジンへのヘッダ転送だけ設定する。
Django側の設定
X-Forwarded-Host, X-Forwarded-Port
使うよう設定する。
USE_X_FORWARDED_HOST = True USE_X_FORWARDED_PORT = True を設定する
Cloudfront-Forwarded-Proto
SECURE_PROXY_SSL_HEADER = ("HTTP_CLOUDFRONT_FORWARDED_PROTO", "https")
セキュリティ
バックエンド側に直接アクセスできる場合は、X-Forwarded-Hostを指定してプロキシすることで実質的にHostヘッダインジェクションができる
これを防ぐために、 ALLOWED_HOSTS の指定は行う必要がある。