[Warning] [blocked] The page at https://stayconnect.shop/ was not allowed to display insecure content from http://stayconnect.shop/auth/signin.
배포한 후 사이트에 접속하면 해당 경고 로그가 지속적으로 발생했다. CORS 에러 로그와 같이 발생해서 CORS 에러인 줄 알았지만 그게 아니라 Mixed Content Issue였다.
배포 환경에서는 Nginx가 ssl 암호화 및 리버스 프록시 역할을 하기 때문에 사용자와는 https 통신을 하고 nginx와 Spring Boot는 내부적으로 통신하기 때문에 굳이 https 통신을 할 필요가 없다. 때문에 http로 통신하도록 했다. 이 경우에 Spring Boot는 Nginx로 부터 받는 요청이 https인지 http인지 알 수가 없다는 것이 문제였다.
간단하게 말하자면 웹 페이지가 HTTPS(보안 프로토콜)를 통해 로드되는 동안, 해당 페이지 내에서 일부 리소스(이미지, 스크립트, 스타일시트 등)가 HTTP(비보안 프로토콜)를 통해 로드되는 상황을 말한다. 이로 인해 전체 페이지의 보안이 저하되고, 사용자 데이터가 도청이나 변조에 노출될 위험이 있다.
현재 필자의 Spring Boot 서버는 Nginx로 부터 받는 요청이 https인지 http인지 알 수가 없기 때문에 기본적으로 정해진 http 프로토콜로 부수적인 파일들을 요청한다. 그렇기 때문에 위 경고문처럼 Nginx에서 해당 요청을 막고 https로 리다이렉팅한 후에 파일들을 불러온다.
웹 사이트를 이용하는데 문제는 없지만 로그가 거슬리니까 해결해보자.
매우 간단함!
server {
listen 80;
server_name stayconnect.shop;
location / {
return 301 https://$host$request_uri;
}
}
.
..
...
server {
listen 443 ssl;
server_name stayconnect.shop;
location / {
.
..
...
proxy_set_header X-Forwarded-Proto $scheme;
}
}
해당 설정만 추가해주면 끝이다. http로 요청이 들어오면 https로 리다이렉팅하고 해당 요청이 https라는걸 명시해주는 헤더 추가
.
..
...
server.forward-headers-strategy=native
그리고 Spring Boot의 application.properties에 해당 설정을 추가해주면 된다.
server.forward-headers-strategy 설정은 Spring Boot에서 애플리케이션이 프록시나 로드 밸런서 뒤에서 실행될 때, 클라이언트의 원래 요청 정보를 어떻게 처리할지 결정하는 설정이다. 이 설정은 애플리케이션이 X-Forwarded-* 헤더를 인식하여 원래의 요청 스키마(HTTP/HTTPS), 호스트, 포트 등을 올바르게 처리할 수 있도록 도와준다.
이렇게 설정해주면 더 이상 경고 로그는 발생하지 않는다.