본문 바로가기

Server/Web

Web - Apache HTTPS 프로토콜 강제 적용하기 (HSTS 설정)

728x90

HSTS(HTTP Strict Transport Security)는 HTTP 응답 헤더에 설정하는 방식으로, 브라우저에게 HTTP 대신 HTTPS를 강제하도록 하는 기능입니다. HSTS 헤더를 중심으로 Apache 서버에서 HTTPS를 강제하는 방법을 알아보겠습니다.

 

HSTS란 무엇인가요?

HSTS는 서버가 브라우저에게 Strict-Transport-Security라는 HTTP 응답 헤더를 통해 HTTPS를 강제하도록 알려주는 보안 기술입니다. 브라우저는 이 헤더를 읽고 다음과 같은 동작을 수행합니다

  • HTTP 연결 차단: HTTP로 접속하려는 시도를 HTTPS로 자동 변환합니다.
  • 정책 기억: HSTS 헤더의 max-age 값에 따라 정해진 기간 동안 HTTPS 강제 정책을 유지합니다.
  • 중간자 공격 방지: HTTP 연결을 완전히 차단해 데이터 탈취 가능성을 낮춥니다.

이 모든 작업은 HTTP 응답 헤더에 Strict-Transport-Security를 설정함으로써 이루어집니다.

HSTS 헤더의 형식

HSTS 헤더의 기본 형식은 다음과 같습니다

Strict-Transport-Security: max-age=<초>; [includeSubDomains]; [preload]
  • max-age: HSTS 정책의 유효 기간을 초 단위로 지정합니다. 예를 들어, 31536000은 1년을 의미합니다.
  • includeSubDomains (선택사항): 모든 서브 도메인에도 동일한 정책을 적용합니다.
  • preload (선택사항): 브라우저의 HSTS Preload List에 사이트를 등록하려면 필요합니다.

 

1. Apache에서 HSTS 헤더 추가하기

HSTS의 핵심은 HTTP 응답 헤더에 Strict-Transport-Security를 포함시키는 것입니다.

이를 Apache 설정에서 적용하는 방법은 다음과 같습니다.

1.1 헤더 설정 전제 조건

  1. HTTPS가 활성화되어 있어야 합니다.
  2. Apache 모듈 mod_headers가 활성화되어 있어야 합니다.
    LoadModule ssl_module modules/mod_ssl.so
    LoadModule headers_module modules/mod_headers.so

1.2 HSTS 헤더 추가

Apache의 HTTPS VirtualHost 설정 파일에 아래와 같이 HSTS 헤더를 추가합니다

<VirtualHost *:443>
    ServerName yourdomain.com
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/yourdomain.crt
    SSLCertificateKeyFile /etc/ssl/private/yourdomain.key

    # HSTS 헤더 설정
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</VirtualHost>
  • always set: 응답에 항상 HSTS 헤더를 추가하도록 설정합니다.
  • max-age=31536000: HSTS 정책을 1년 동안 유지합니다.
  • includeSubDomains: 서브 도메인에도 동일한 정책을 적용합니다.
  • preload: 브라우저의 HSTS Preload List 등록을 위한 옵션입니다.

2. HSTS 헤더 동작 방식 확인

HSTS가 제대로 설정되었는지 확인하려면 응답 헤더를 직접 확인할 수 있습니다.

2.1 curl 명령어로 헤더 확인

아래 명령어를 실행하여 서버의 응답 헤더를 확인합니다

curl -I https://samso.tistory.com

출력 결과에 다음과 같은 헤더가 포함되어 있어야 합니다.

Strict-Transport-Security: max-age=31536000; includeSubDomains;

 

2.2 브라우저 개발자 도구 확인

  1. 브라우저에서 F12를 눌러 개발자 도구를 엽니다.
  2. "네트워크(Network)" 탭으로 이동한 후, HTTPS 요청을 선택합니다.
  3. "응답 헤더(Response Headers)"에서 Strict-Transport-Security 값을 확인합니다.

3. HSTS Preload List 등록 (선택사항)

HSTS Preload List는 브라우저 제조사가 관리하는 HTTPS 강제 사이트 목록입니다.

등록하면 브라우저가 사이트 접속 전에도 HTTPS를 강제합니다.

3.1 등록 조건

  1. Strict-Transport-Security 헤더에 다음 값이 포함되어야 합니다
    Strict-Transport-Security: max-age=31536000; includeSubDomains;


  2. HTTP 요청이 모두 HTTPS로 리다이렉트 되어야 합니다.

3.2 등록 방법

HSTS Preload List에 접속하여 도메인을 제출합니다. 제출 후 조건을 충족하지 못하면 오류 메시지가 표시되며, 수정 후 다시 제출해야 합니다.

 

4. 설정 주의사항

  1. HSTS 정책은 되돌리기 어렵습니다.
    • 설정 후 클라이언트는 지정된 max-age 동안 HTTP 접속을 시도하지 않습니다.
      테스트 시에는 짧은 max-age 값을 사용한 후 점진적으로 연장하세요.
  2. HTTPS 설정이 완벽해야 합니다.
    • HTTPS가 제대로 작동하지 않으면 사이트에 접근할 수 없는 문제가 발생할 수 있습니다.
  3. preload 사용은 신중히 결정하세요.
    • Preload List에 등록되면 브라우저의 목록에서 제거하기가 까다롭습니다.
728x90
반응형