본문 바로가기
[개발] Programming/Server

HSTS 설정으로 HTTP를 HTTPS로 리다이렉트 하기 (HTTP Strict Transport Security)

by eatyourKimchi 2020. 11. 30.

 

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

 

 

댓글