사이트에서 SSL을 사용하는 것은 사용자의 보안과 개인 정보를 보호하는 중요한 방법입니다. 하지만 SSL을 사용 설정하는 것만으로는 충분하지 않습니다. 쿠키에 Secure 속성을 설정하는 것부터 HTTP Strict Transport Security를 사용 설정하는 것, 콘텐츠 보안 정책을 사용하여 사이트 권한을 잠그는 것까지 사이트에서 제공하는 보안을 강화하기 위해 취할 수 있는 조치는 많습니다. 하지만 이러한 강력한 기능을 배포하는 것은 때때로 까다로울 수 있습니다. 더 엄격한 형태의 SSL을 출시할 수 있도록 Chrome 46에는 HPKP 보고라는 기능이 제공됩니다.
이러한 약어는 무엇을 의미하나요?
오늘날 웹의 보안은 SSL 인증서를 사용합니다. SSL 인증서는 웹사이트가 본인임을 증명하는 암호화 서명입니다. 브라우저가 https://developers.google.com과 같은 URL에 요청을 전송하면 서버는 SSL 인증서를 제공하고 인증서가 유효하면 브라우저는 요청을 허용하고 주소 표시줄에 녹색 자물쇠가 있는 웹사이트 URL을 표시합니다.
유효한 인증서란 무엇인가요? 인증서가 유효하다고 간주되려면 인증서에 인증 기관 (CA)의 서명이 있거나 CA에서 서명한 다른 인증서 (중간 CA라고 함)의 서명이 있어야 합니다. 브라우저와 운영체제에는 인증서를 발급하는 데 신뢰할 수 있는 수백 개의 CA 목록이 제공됩니다. 하지만 문제는 이러한 CA는 기본적으로 모든 웹사이트의 인증서를 발급할 수 있다는 점입니다. 이러한 도구 중 하나라도 손상되거나 오작동하면 웹 전체에 치명적인 영향을 미칠 수 있습니다.
HTTP 공개 키 고정(HPKP)을 입력합니다. 이 표준을 사용하면 웹사이트에서 브라우저에 SSL 인증서 체인의 일부를 기억 (또는 '고정')하도록 지시하는 HTTP 헤더를 전송할 수 있습니다. 그러면 브라우저는 이전에 수신한 핀과 일치하지 않는 후속 연결을 거부합니다. 다음은 HPKP 헤더의 예입니다.
Public-Key-Pins:
pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
max-age=259200
이 헤더는 두 인증서 해시를 핀으로 지정합니다. 하나는 사이트의 인증서 체인에 있는 인증서의 해시이고 다른 하나는 백업 핀 또는 사이트에서 인증서를 교체해야 할 때 사용할 수 있는 인증서의 해시입니다. 헤더에는 max-age
값도 포함됩니다. 이 시간(초)이 지나면 브라우저에서 고정이 삭제됩니다.
HPKP에 관한 일반적인 내용은 사양 또는 Chrome 개발자 크리스 팔머의 훌륭한 블로그 게시물을 참고하세요.
지금 HPKP를 사용 설정해야 하나요?
반드시 그런 것은 아닙니다. HPKP를 배포할 때 실수로 사이트를 DoS 공격하기가 매우 쉽습니다. 사이트를 하나의 인증서 세트에 고정한 후 새 인증서를 배포해야 하는 경우 고정이 표시된 사용자는 고정이 만료될 때까지 사이트에 액세스할 수 없습니다 (헤더의 max-age
값 기준).
올바르게 적용하기가 쉽지 않으므로 HPKP는 현재 보안이 중요한 일부 사이트에서만 사용되고 있습니다. HPKP를 사용 설정하려면 매우 짧은 max-age 값으로 시작하고 문제가 없으면 점차 늘려야 합니다.
HPKP 보고란 무엇이고 어떤 도움이 되나요?
Chrome 46에서 제공되는 HPKP 보고는 HPKP를 배포할 때 구성 오류를 감지하는 데 사용할 수 있는 기능입니다.
먼저 Public-Key-Pins 헤더 대신 Public-Key-Pins-Report-Only
헤더를 전송하는 것으로 시작할 수 있습니다.
Public-Key-Pins-Report-Only:
max-age=2592000;
pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
report-uri="https://example.net/pkp-report"
사이트에서 이러한 헤더를 전송하면 Chrome은 현재 연결이 고정된 연결과 일치하는지 확인하고 일치하지 않으면 report-uri
에 보고서를 전송합니다. Chrome은 Report-Only 헤더의 고정 항목을 기반으로 요청을 차단하지 않으므로 사이트를 DDoS할 위험 없이 HPKP를 사용해 보고 사용자에게 문제가 발생하는지 확인할 수 있는 안전한 방법입니다.
Report-Only 헤더는 수신된 요청에만 적용됩니다. 브라우저는 실제 핀과 달리 보고서 전용 핀을 기억하지 않습니다. 이렇게 하면 사용자 브라우저에 잘못된 값을 캐시하는 문제에 대해 걱정하지 않고 구성을 테스트할 수 있으며, 서버에 보고서가 너무 많이 전송되지 않도록 점진적으로 (예: 단일 리소스에서만) 출시할 수 있습니다.
실제 Public-Key-Pins
헤더를 출시하여 고정을 적용할 때 문제가 발생하면 계속해서 보고서를 수신할 수 있도록 해당 헤더에 report-uri 값도 포함할 수 있습니다.
HPKP 위반 보고서에는 어떤 내용이 포함되나요?
HPKP 위반 보고서는 구성된 report-uri
에 HTTP POST 요청으로 전송되는 JSON 메시지입니다. 필드 목록은 사양에서 확인할 수 있지만 여기서는 served-certificate-chain
및 validated-certificate-chain
필드 중 두 가지를 강조 표시하겠습니다. served-certificate-chain
는 Chrome에서 요청의 SSL 연결을 설정할 때 수신한 인증서와 정확히 일치합니다. 반면 validated-certificate-chain
는 Chrome에서 서버의 인증서를 확인하려고 할 때 다시 빌드한 체인으로, 놀랍게도 served-certificate-chain
와 다를 수 있습니다. 클라이언트마다 인증서 유효성 검사를 다른 방식으로 실행하며, 이로 인해 HPKP가 잘못 구성되는 경우가 많습니다. 예상치 못한 신고가 접수되는 경우 이 입력란을 선택해야 합니다.
마지막 '주의'사항
HPKP 보고를 배포하는 경우 Chrome은 보고서 전송 요청을 비롯한 모든 요청에 대해 핀 유효성 검사를 실행합니다. 따라서 사이트에 HPKP를 배포한 경우 고정하지 않은 다른 도메인으로 HPKP 보고서를 전송하는 것이 좋습니다. 그러지 않으면 사이트에서 고정 위반이 발생하면 동일한 도메인에 대한 신고가 트리거되어 고정 위반도 실패하므로 신고를 받지 못하게 됩니다.
다른 도메인이 없는 경우 대신 report-uri.io와 같은 서비스를 사용해 보세요. 이 서비스는 위반 신고를 대신 처리해 줍니다.