본문으로 건너뛰기

우리 사이트의 보안 헤더가 실제로 하는 일

StorM Web Engine3분 읽기BYTHECLOUD ENT

StorM Web Engine이 사이트와 함께 보내는 응답 헤더 일곱 개와 페이지 정책입니다. 실제 값, 각 줄이 브라우저에게 막는 일, 그리고 헤더가 할 수 없는 일을 정리했습니다.

헤더는 브라우저에게 주는 지시입니다

보안 헤더는 서버가 페이지보다 먼저 보내는 한 줄짜리 지시입니다. 브라우저는 이를 읽고 허용하는 범위를 바꿉니다. 무엇을 실행할지, 틀(프레임) 안에 무엇을 보여 줄지, 원래 페이지에 관한 정보를 어디까지 보낼지가 여기에 해당합니다. 방문자는 페이지에서 차이를 보지 못합니다. 이 줄은 브라우저를 위한 규칙일 뿐입니다.

이 사이트의 응답에는 이런 줄이 일곱 개 실립니다. 내용 정책은 다릅니다. 페이지 안에 들어 있어서, 그 규칙은 계산된 바로 그 바이트와 언제나 함께 갑니다.

우리가 보내는 헤더 일곱 개

Strict-Transport-Security: max-age 값은 1년입니다. 그 기간 동안 브라우저는 이 사이트에 HTTPS로만 접속합니다. 이 값은 includeSubDomains와 preload를 뺐기 때문에 이 호스트에만 적용됩니다.

X-Content-Type-Options: nosniff. 브라우저는 서버가 밝힌 파일 종류를 따르고, 내용을 보고 종류를 짐작하지 않습니다. 그래서 이미지로 보낸 파일은 스크립트로 실행되지 않습니다.

X-Frame-Options: SAMEORIGIN. 다른 사이트의 페이지는 이 페이지를 틀 안에 보여 줄 수 없습니다. 같은 사이트의 페이지는 보여 줄 수 있습니다.

Referrer-Policy: strict-origin-when-cross-origin. 방문자가 다른 사이트의 링크를 따라갈 때 브라우저는 사이트 이름만 보내고, 페이지 주소 전체는 보내지 않습니다. 이 사이트 안의 요청에는 전체 주소가 갑니다.

Permissions-Policy: camera=(), microphone=(), geolocation=(). 페이지와 그 안의 틀은 카메라, 마이크, 기기 위치를 쓸 수 없습니다.

Cross-Origin-Opener-Policy: same-origin-allow-popups. 다른 사이트의 페이지는 이 창에 직접 손을 댈 수 없습니다. 이 페이지가 연 팝업 창은 여전히 이 페이지에 응답할 수 있습니다. 로그인과 결제 창이 이것을 필요로 합니다.

X-Permitted-Cross-Domain-Policies: none. 교차 도메인 정책 파일이 이 사이트에 대한 접근을 허용할 수 없습니다.

두 줄은 일부러 뺍니다. 사이트 페이지는 결제를 싣지 않으므로 결제 권한 줄은 보내지 않습니다. DNS 선인출 조절 줄도 사이트에는 보내지 않습니다.

페이지 안의 내용 정책

내용 정책은 헤더가 아닙니다. 페이지 자체의 head 요소 안에 있는 한 줄입니다. default-src 'self'는 이름이 없는 모든 것의 기본 규칙을 정합니다. object-src 'none'은 플러그인 객체를 막습니다. base-uri 'self'와 form-action 'self'는 페이지의 기준 주소와 양식 전송처를 이 사이트에 둡니다. 그림, 미디어, 연결은 페이지가 이름을 밝힌 바깥 저장소 한 곳에도 닿을 수 있습니다.

script-src 'self' 뒤에는 해시가 열한 개 있습니다. 페이지에 직접 적힌 스크립트 하나마다 해시 하나입니다. 이 사이트의 스크립트 파일은 실행될 수 있습니다. 텍스트가 해시와 맞지 않는 스크립트는 실행되지 않습니다. 정책에는 'unsafe-inline'도 'unsafe-eval'도 없습니다. 목록에 없는 페이지 안의 텍스트는 실행되지 않고, 페이지가 열려 있는 동안 텍스트를 코드로 바꿀 수도 없습니다.

onclick 같은 인라인 이벤트 처리기는 script-src-attr 'none'이 막습니다. 실제 HTML에는 이런 처리기가 하나도 없습니다. 예전에 처리기가 필요했던 부품은 이제 data-bws-on 속성에 동작 이름을 적고, 페이지의 스크립트 하나가 동작 표를 가지고 있습니다.

style-src는 인라인 스타일을 허용합니다. 페이지 배치가 style 속성을 쓰기 때문입니다. 스크립트에는 같은 허용이 없습니다. 페이지 정책에는 frame-ancestors가 없으므로, 틀 사용은 X-Frame-Options 헤더가 정합니다.

해시는 페이지를 만들 때 페이지의 바이트로부터 계산합니다. 스크립트의 글자 하나가 바뀌면 해시가 맞지 않게 되고, 페이지 자체의 검사가 정책을 다시 만들 때까지 그 스크립트가 덮이지 않았다고 보고합니다.

헤더가 할 수 없는 일

  • 방문자의 브라우저를 지킵니다. 서버, 저장된 자료, 사이트 주인의 계정, 서버에서 도는 코드는 지키지 않습니다.
  • 정책은 목록에 없는 것을 막습니다. 목록에 없는 새 인라인 스크립트는 정책을 다시 만들 때까지 실행되지 않습니다.
  • 사람이 입력한 내용을 검사하지 않습니다. 입력 검사와 로그인 제한은 서버에 있어야 합니다.
  • 지원하지 않는 줄은 브라우저가 무시합니다. 헤더는 여러 층 가운데 하나이며, 완전한 방어가 아닙니다.

BWS로 발행

더 보기 — 연구

  1. StorM Web Engine한 문서, 여러 언어
  2. StorM Web Engine카드 단말: 짝짓기와 해지의 규칙
  3. StorM Web Engine모든 날짜는 가게의 시계를 따릅니다