프로덕션 환경에서 Play 서버 AllowedHostsFilter 문제 해결

오형택·2024년 3월 21일
0

Play-Spark

목록 보기
6/8
post-thumbnail

배포된 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.testFakeRequest를 사용할 경우 요청 “Host” 헤더는 [localhost](http://localhost)가 되므로 허용 목록에 localhost 관련 호스트 이름을 추가해줘야 한다.

play.filters.hosts.allowed = ["<deployed-host-name>", "localhost", "127.0.0.1", "::1"]

profile
개발자 지망생

0개의 댓글