Cloud Front에서 HSTS Preload 지원

소개



이쪽은, ZOZO 테크놀로지스 2 Advent Calendar 2018 24일째의 기사입니다.

이번에는 Lambda@Edge를 사용하여 CloudFront에 HSTS Preload를 도입해 보겠습니다.

HSTS Preload란?



HSTS is 무엇



HSTS(Hypertext Strict Transport Security)는, 웹 서버가 가지는 응답 헤더의 일종으로, 「이 서버로 접속할 때는 반드시 HTTPS로 액세스 해 주세요」라고 하는 메세지를 Web 브라우저에 전하는 기능을 가지고 있습니다.

구체적으로는 Strict-Transport-Security: max-age=31536000; 와 같이 max-age를 갖게 하는 것으로, 브라우저에 이 규정의 시간이 지날 때까지는 HTTPS를 강제화하도록(듯이) 작동합니다.

이것에 의해, 만일 유저가 최초 HTTP로 통신하러 왔을 경우(URL바로 http://~로 왔을 경우)도 다음 회 이후부터는 디폴트로 HTTPS 통신이 되어, 통신의 오버헤드를 삭감할 수 있다고 하는 메리트가 있습니다 .

HSTS의 preload 속성



그러나 HSTS는 한 번 서버에 연결하지 않으면 유효하지 않다는 문제도 있으며, 이것을 해결하기 위해 만들어진 것이 preload 속성입니다.

HSTS 응답 헤더에 Strict-Transport-Security: max-age=63072000; includeSubdomains; preload가 있는 상태에서 Google이 게시한 등록 양식에 액세스하면 preload를 활성화할 준비가 됩니다.

무슨 일이야?



자꾸 말하면 이런 느낌입니다.
  • 양식 등록
  • preload 목록이 포함 된 JSON에 도메인이 잠시 후 추가됨
  • Chrome과 같은 주요 브라우저가 업데이트 된 시점에서 JSON에 자신의 도메인이 추가되고 브라우저에서 preload 목록에 추가

  • 이렇게 하면 주요 브라우저에 "미리 HTTPS 통신을 강제하는 사이트"로서 자신의 도메인을 인식할 수 있게 됩니다.

    CloudFront의 문제점



    CloudFront는 불행히도 HTTP 헤더를 깔끔하게 처리하는 메커니즘을 제공하지 않습니다. 또, S3에 HSTS를 preload 첨부로 건네주는 것도, 현상 불가능합니다.

    거기서 등장하는 것이 Lambda@Edge입니다.

    Lambda@Edge란?



    Lambda@Edge는 CloudFront의 규칙 정의에 Lambda(Node.js)를 사용할 수 있는 서비스입니다. 자세한 내용은 당사 테크 블로그에서 썼습니다. 여기를 참조하십시오.

    실제 코드



    node.js
    'use strict';
    
    exports.handler = (event, context, callback) => {
      const response = event.Records[0].cf.response;
      const headers = response.headers;
    
      //Set new headers 
      headers['strict-transport-security'] = [{
        key: 'Strict-Transport-Security',
        value: 'max-age=63072000; includeSubdomains; preload'
      }];
    
      callback(null, response);
    };
    

    이 코드를 오리진 응답에 넣어주면 오리진의 콘텐츠 반환에 맞는 형태로 HSTS를 쓸 수 있습니다.

    반영을 확인할 수 있으면Google 등록 양식에서 해당 도메인의 신청을 해 봅시다.

    또한, HSTS preload에서는 max-age에 하한값이 있는 것과 includeSubdomains도 강제화되는 점이 있습니다. 주의해 주십시오.

    반영이 완료되면 아래와 같이 preload 목록이 모든 브라우저에서 활성화된다는 것을 알 수 있습니다. 덧붙여 이쪽의 반영에도 잠시의 시간을 가지므로, 주의해 주세요.

    좋은 웹페이지 즐겨찾기