Cloud Front에서 HSTS Preload 지원
4342 단어 hstsCloudFrontLambda@Edge
소개
이쪽은, 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를 활성화할 준비가 됩니다.
무슨 일이야?
자꾸 말하면 이런 느낌입니다.
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를 활성화할 준비가 됩니다.무슨 일이야?
자꾸 말하면 이런 느낌입니다.
이렇게 하면 주요 브라우저에 "미리 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 목록이 모든 브라우저에서 활성화된다는 것을 알 수 있습니다. 덧붙여 이쪽의 반영에도 잠시의 시간을 가지므로, 주의해 주세요.
Reference
이 문제에 관하여(Cloud Front에서 HSTS Preload 지원), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/inductor/items/c3df09aea97894807ca9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
'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);
};
Reference
이 문제에 관하여(Cloud Front에서 HSTS Preload 지원), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/inductor/items/c3df09aea97894807ca9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)