Nginx 301 https redirect 와 HSTS설정

클라이언트와 호스트 웹서버 연결의 보안을 위해 ssl 연결을 처음부터 강제하는것이 안전하다.
기본적으로 HSTS 헤더 설정이 호스트 측에서 설정되어있다면 ssl연결이 되지만 강제로 주소를 http://sample.com 과 같이 연결을 해버린다면 기본적으로 ssl연결이 되지 않는 상태로 접속을 하게된다.
이 포스트에서는 301 redirect와 HSTS 설정을 설명한다.

301 redirect

301 redirect를 이용해 http주소로 접속시 https로 연결하게 하는 방법은 다음과 같다.
virtualhost 파일 별로 다음 구문을 추가하나 80번 포트(http)와 443번 포트(https)의 설정을 분리해야한다.

1
2
3
4
5
6
7
8
9
10
11
server {
       listen         80;
       server_name    sample.com www.sample.com;
       return         301 https://$host$request_uri;
}
server {
       listen         443 ssl;
       server_name    sample.com www.sample.com;
       //아래부터는 나머지 설정들
}
cs

위와 같이 설정시 80번 포트에 대한 응답으로 301 return 을 하게 되며 강제로 http://sample.com 으로 접속하게 되어도 301 return 응답으로 https로 리다이렉트 하게 된다.

HSTS (HTTP Strict Transport Security)

https로 강제하려고 301 redirect를 사용하면 https연결이 유도 되지만 이는 결국 클라이언트 측이 https연결로 ‘재’접속을 하게 되는것이라 중간에서 하이제킹을 시도할시 취약점이 될 수 있다.
브라우저가 해당 도메인에 최초접속시 가장 먼저 HSTS 설정을 먼저 서버측에 확인하게 되는데 이를 설정해주면 위와같은 취약점을 보완할 수 있다.
이는 리다이렉트가 서버가아닌 클라이언트 측의 브라우저 단에서 응답을 기반으로 https연결을 강제함으로 연결이 보다 안전하다.
서버측에서 해야하는 작업은 다음과 같다.
virtualhost 파일에 다음 구문을 추가해준다.

1
add_header StrictTransportSecurity “max-age=63072000; includeSubdomains; preload”;
cs

add_header StrictTransportSecurity = STS에 대한 헤더 를 추가한다.
max-age=63072000 = 얼마나 이 설정을 보관할지(클라이언트의 브라우저에서) 설정하는 기간이며 단위는 초(sec)단위 이다. 이 경우에는 2년이다.
includeSubdomains = 서브도메인에도 이 옵션을 적용한다.
preload = 이 설정을 브라우저에서 적용이 preload로 이루어짐.

위와 같이 nginx에서 https연결을 강제하는 두가지 방법을 알아보았다.
두가지 전부 설정하는것을 개인적으로 권장하며 이렇게 설정시 클라이언트와 호스트의 연결이 더욱 안전해지게 된다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다