배포된 Play 서버에 API 요청을 날려봤는데 400 Bad Request
응답을 받았다. 배포 컨테이너 로그를 확인해보니 다음과 같은 경고 로그를 확인할 수 있었다.
2024-03-20 02:26:10 WARN p.filters.hosts.AllowedHostsFilter Host not allowed: <play-server-host-name>
로컬 환경에서 만나보지 못한 문제였고, 프로덕션 환경에서 Play 애플리케이션을 실행할 때 발생하는 문제임을 알 수 있었다.
문제가 되는 “호스트”는 HTTP 요청이 도달하는 서버 측의 도메인 이름 또는 호스트 이름을 가리키는 것으로, 클라이언트(웹 브라우저, API 클라이언트 등)가 HTTP 요청의 ‘Host’ 헤더에 담아서 전송한다. (ex: [http://sample.com/some/path](http://example.com/some/path)
로 요청을 보낼 경우, ‘Host’ 헤더는 sample.com
이 된다)
Play 애플리케이션의 기본 설정에서 개발 모드(sbt run
)에서는 모든 호스트가 허용되지만, 프로덕션 모드에서는 ‘localhost’만 허용된다. 따라서 설정 파일(conf/application.conf
)을 통해 배포 환경의 호스트 이름을 허용 목록에 추가해줘야 한다.
play.filters.hosts.allowed = ["<deployed-host-name>"]
💡 배포 환경의 호스트 이름만 허용 목록에 추가해주면 Controller 테스트 과정에서 문제가 생길 수 있다. 테스트 코드에서
play.api.test
의FakeRequest
를 사용할 경우 요청 “Host” 헤더는[localhost](http://localhost)
가 되므로 허용 목록에localhost
관련 호스트 이름을 추가해줘야 한다.
⇒
play.filters.hosts.allowed = ["<deployed-host-name>", "localhost", "127.0.0.1", "::1"]