운영 중인 서비스의 웹 취약점 점검 결과, HTTP로 접속이 가능하다는 점이 보안 취약점으로 지적되었습니다.
기존에는 HTTPS가 정상적으로 적용되어 있었지만, HTTP 주소로도 서비스에 접속할 수 있는 상태였습니다. 보안 강화를 위해 HTTP 요청을 차단하는 대신 HTTPS로 자동 리다이렉트하도록 변경하는 작업을 진행했습니다.
이번 글에서는 실제 운영 서버에서 적용했던 내용을 바탕으로 Tomcat에서 HTTP를 HTTPS로 리다이렉트하는 방법과 작업 과정에서 확인했던 사항들을 정리해보겠습니다.
HTTPS 적용 후 확인한 사항
먼저 브라우저에서 아래와 같이 접속을 확인했습니다.
http://도메인
https://도메인
두 주소 모두 정상적으로 접속되었습니다.
HTTPS는 적용되었지만 HTTP도 그대로 서비스되고 있었기 때문에 HTTP 요청을 HTTPS로 자동 전환하도록 변경하기로 했습니다.
server.xml 확인
Tomcat의 server.xml 파일을 열어 Connector 설정을 확인했습니다.
기본적으로 HTTP Connector는 아래와 같은 형태입니다.
<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
여기서 redirectPort는 보안 제약(Security Constraint)이 적용되었을 때 HTTP 요청을 HTTPS 포트로 리다이렉트하기 위한 설정입니다.
처음에는 server.xml의 redirectPort만 설정하면 HTTP 요청이 자동으로 HTTPS로 전환될 것이라고 생각했습니다.
하지만 실제 운영 환경에서는 server.xml 만 수정해서는 HTTP 요청이 HTTPS로 리다이렉트되지 않았습니다.
HTTPS Connector 설정
HTTPS Connector가 정상적으로 설정되어 있는지도 함께 확인했습니다.
HTTPS Connector가 설정되어 있지 않으면 redirectPort가 동작하더라도 HTTPS로 리다이렉트할 수 없습니다.
따라서 인증서 경로와 HTTPS 포트가 올바르게 설정되어 있는지 먼저 확인했습니다.
설정을 수정한 후에는 XML 문법 오류가 없는지도 함께 확인했습니다.
web.xml 설정 추가
원인을 확인해보니 server.xml의 redirectPort는 web.xml에 보안 제약(Security Constraint)이 설정되어 있어야 동작했습니다.
그래서 WEB-INF/web.xml에 아래와 같이 security-constraint를 추가했습니다.
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
CONFIDENTIAL을 설정하면 해당 URL에 대해 HTTPS 통신을 요구하도록 Tomcat이 동작합니다.
이때 server.xml의 redirectPort 설정을 참고하여 HTTP 요청을 HTTPS 포트로 자동 리다이렉트합니다.
server.xml의 redirectPort와 web.xml의 security-constraint설정을 함께 적용한 후 정상적으로 HTTP 요청이 HTTPS로 리다이렉트되는 것을 확인했습니다.
Tomcat 재기동
설정을 저장한 후 Tomcat을 재기동했습니다.
shutdown.sh
startup.sh
또는 운영 환경에 맞게 서비스를 재시작했습니다.
재기동 후에는 catalina.out 로그를 확인하여 오류 없이 실행되는지 먼저 확인했습니다.
리다이렉트 확인
브라우저에서 다시 HTTP 주소로 접속했습니다.
http://도메인
접속과 동시에
https://도메인
으로 자동 이동하는 것을 확인했습니다.
브라우저뿐 아니라 실제 사용하는 서비스에서도 정상적으로 접속되는지 함께 테스트했습니다.
작업하면서 주의했던 점
처음에는 HTTP를 완전히 막는 방향도 고려했습니다.
하지만 운영 중인 서비스는 다양한 환경에서 접속하기 때문에 단순히 HTTP를 차단하면 일부 서비스에서 문제가 발생할 수도 있습니다.
그래서 HTTP 요청을 HTTPS로 자동 전환하는 방식으로 적용했고, 적용 후 브라우저와 서비스 모두 정상적으로 동작하는 것을 확인했습니다.
운영 서버에서는 설정 변경 후 반드시 충분한 테스트를 진행하는 것을 권장합니다.
요약
Tomcat에서 HTTPS를 적용했다면 HTTP를 그대로 허용하기보다 HTTPS로 자동 리다이렉트하는 것이 보안과 사용자 편의성 모두에 도움이 됩니다.
이를 위해서는 server.xml의 redirectPort 설정뿐 아니라 WEB-INF/web.xml에 security-constraint도 함께 설정해야 합니다.
설정을 적용한 후에는 Tomcat을 재기동하고 브라우저와 실제 서비스에서 정상적으로 동작하는지 반드시 확인하는 것이 중요합니다.
자주 묻는 질문(FAQ)
Q. HTTP를 완전히 차단하는 것과 리다이렉트하는 것은 어떤 차이가 있나요?
HTTP 차단은 HTTP 요청 자체를 허용하지 않는 방식입니다. 반면 리다이렉트는 HTTP로 접속한 사용자를 HTTPS 주소로 자동 이동시키는 방식입니다. 서비스 중단 없이 보안을 강화할 수 있어 일반적으로 리다이렉트 방식을 많이 사용합니다.
Q. server.xml만 수정하면 적용되나요?
server.xml의 redirectPort설정만으로는 HTTP 요청이 HTTPS로 리다이렉트되지 않을 수 있습니다. Tomcat에서 HTTP 요청을 HTTPS로 강제하려면 WEB-INF/web.xml에 security-constraint를 함께 설정해야 합니다. 두 설정을 모두 적용한 후 Tomcat을 재기동하면 정상적으로 리다이렉트됩니다.
Q. HTTPS가 적용되었는데도 HTTP로 접속됩니다.
server.xml의 HTTP/HTTPS Connector 설정과 redirectPort값, WEB-INF/web.xml의 security-constraint설정이 모두 올바르게 적용되어 있는지 확인해 보세요. 설정을 변경한 후에는 Tomcat을 재기동하고, 브라우저 캐시를 비운 뒤 다시 테스트하는 것이 좋습니다.