HSTS (HTTP Strict Transport Security)
HSTS를 적용하면 클라이언트가 도메인에 접속한 후 웹 서버로부터 응답을 받을 때 Strict Transport Security라는 헤더를 받게 되고, 다음 요청부터는 설정한 기간 동안에는 무조건 HTTPS로만 통신하게 됩니다. 즉, 클라이언트가 HTTP로 접속을 하게 되더라도 HSTS 설정으로 인해 첫 요청은 HTTP로 가더라도 다음 요청부터는 HTTPS로만 통신하게 되는 셈이죠. 결국 브라우저 단에서부터 HTTPS 연결을 강제하는 설정입니다.
HSTS를 설정하는 이유는 MITM(Man In The Middle) 공격을 막기 위함입니다. HTTP로 접속할 때 패킷을 스니핑하여 요청한 뒤 response가 오면 이를 공격에 사용하는 건데요, HSTS 설정이 되어 있으면 응답이 HTTPS로 오기 때문에 공격자는 이를 해석할 수 없게 됩니다. (대부분의 브라우저에서 지원하고 있음.)
WAS HSTS 적용 방법
HTST를 적용하는 방법은 크게 3가지가 있는 것 같습니다. '1. 로드밸런서에서 2. 톰캣 conf/web.xml 설정 3. 자바 클래스 파일에서 설정'. 로드 밸런서가 있으면 설정만으로 간편하게 적용할 수 있지만, 2번의 경우 톰캣 xml 수정/재기동이 필요하며, 3번 방법의 경우 응답을 할 때 HSTS를 설정해주는 방법으로 자바 소스 수정이 필요합니다.
이번 글에서는 3번과 2번 방법으로 HSTS를 설정하는 방법을 소개하겠습니다. 아 그리고 너무 당연한 이야기지만, HTTPS로 리다이렉트 하는 설정이므로 서버에 보안 인증서는 설치되어 있어야 합니다ㅋ
1. 톰캣 conf/web.xml 설정
<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>hstsMaxAgeSeconds</param-name>
<param-value>31536000</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>httpHeaderSecurity</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
* hstsMaxAgeSeconds는 얼마동안 리다이렉트를 유지할지 설정하는 부분입니다. 보통 기본 180일부터 설정한다고 하네요. 아래 자바 소스에는 max-age에 해당됩니다.
2. 자바 소스 설정
아래 메소드를 추가한 뒤에 web.xml에 등록하여 호출하도록 설정합니다.
- 자바 메소드 추가 -
소스 출처: gs.saro.me/dev?tn=423
package core.init;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
public class HSTSFilter implements Filter
{
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException
{
// 필터적용
((HttpServletResponse)res)
.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload");
chain.doFilter(req, res);
}
@Override public void destroy() {}
@Override public void init(FilterConfig arg0) throws ServletException {}
}
- web.xml 필터 추가 -
<filter>
<filter-name>HSTSFilter</filter-name>
<filter-class>core.init.HSTSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HSTSFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
HSTS 적용 여부 테스트
가장 간단하게는 웹 접속 후 F12 브라우저 개발자 모드로 확인할 수 있습니다. 크롬 기준 F12를 누르면 DevTools가 뜨는데 여기서 네트워크 탭에 들어가서 응답 Header를 확인하면, Strict Transport Security라는 설정이 생긴 걸 확인할 수 있습니다.
다른 방법으로는 HSTS 설정을 확인할 수 있는 웹 사이트가 있습니다. sslLabs 같은 서비스라고 생각하면 됩니다.
테스트 사이트 : gf.dev/hsts-test
HSTS 참고 자료
HSTS 정의 RFC : tools.ietf.org/html/rfc6797
HSTS 톰캣 아파치 설정 : support.ptc.com/help
HSTS 소스 설정 : gs.saro.me/dev?tn=423
'[개발] Programming > Server' 카테고리의 다른 글
윈도우 서버에 MP4 파일 호출 시 404 오류 해결 방법 (MIME 등록) (0) | 2021.06.12 |
---|---|
톰캣 서버가 클래스를 못 찾는 오류 - 클래스 파일 인식 문제 몇 가지 (0) | 2021.03.14 |
IIS, 톰캣 연동 웹 서버에서 JSP 파일 호출 시 404 뜨는 경우 (0) | 2020.11.30 |
윈도우 서버에서 현재 동시접속자 정보 확인 - netstat (0) | 2020.10.14 |
SPF(메일서버등록제) 란 무엇이고, 설정을 확인하는 방법 (0) | 2020.10.06 |
댓글