오늘 STS(Strict-Transport-Security)를 적용하려고 검색을 하다가 몇 가지 처음 보는 헤더들을 찾았다. 이 글에 자세히 설명이 나와있는데 대충 적어보면 이렇다.
1. Content-Security-Policy
누군가 페이지에 외부 스크립트 등을 걸어서 XSS 공격을 할 수 있기 때문에 페이지에서 허용할 origin을 지정할 수 있다. Content의 종류는 아래와 같다.
script-src
: JavaScript code (이 헤더를 사용하는 가장 큰 이유다)
connect-src
: XMLHttpRequest, WebSockets, and EventSource.
font-src
: fonts
frame-src
: frame ulrs
img-src
: images
media-src
: audio & video
object-src
: Flash (and other plugins)
style-src
: CSS
자신의 사이트와 구글의 각종 스크립트들만 허용하고 싶다면 아래와 같이 적어주면 된다.
Content-Security-Policy: script-src 'self' https://apis.google.com
2. X-Frame-Options
가끔 누군가가 자신의 사이트와 비슷한 도메인을 사서 아무 내용도 없이 자신의 사이트만 전체 크기의 프레임으로 박아놓는 짓을 한다는 글을 몇 번 본 적이 있다. 접근하는 유저만 엄청 끌어모은 다음 나중에 갑자기 내용을 바꿔서 날로먹는 방법이라는데 아무튼 이런 짓을 막을 수 있게 자신의 페이지가 Frame 안에 들어가는 것을 방지하게 해준다. Clickjacking도 막을 수 있겠다.
사용 방법은 아래와 같이 3가지가 있다.
X-Frame-Options: DENY
(프레임 안에 절대 들어가지 못하게 한다)
X-Frame-Options: SAMEORIGIN
(같은 origin일 경우에만 허용한다)
X-Frame-Options: ALLOW FROM hxtp://some-domain.com
(특정 origin에서만 허용한다)
3. X-Content-Type-Options
Github에서 잘 쓰고 있다고 하는데 jpg 확장자로 js파일을 올려 우회를 한 후에 script 태그에 src로 넣는 수법을 방지하는 헤더다. 이 헤더를 넣으면 MIMETYPE과 다르게 사용하지 못하게 한다. nosniff
를 넣어주면 활성화가 된다.
4. Strict-Transport-Security
내가 오늘 하려고 했던 STS다. SSL strip 공격을 막기 위해 나온 헤더인데 이 헤더를 받게 되면 브라우저는 다음에 접속할 땐 URL이 http로 지정되어있어도 무시하고 무조건 https로 접속하게 된다. 이런 방법으로 SSL strip 공격을 피할 수 있게 된다.(단, 한 번이라도 이미 접속은 한 상태여야 한다)
사용방법은 그냥 쿠키 지정하듯이 max-age를 초단위로 입력해주면 된다. includeSubDomains
를 넣어주면 서브도메인들에도 적용이 되지만 나는 SSL 인증서가 와일드카드가 아니라 그건 뺐다.
참고로 오늘 실험해본 결과 HTTP 통신을 하고 있을 때는 이 헤더를 무시하게 된다. 꼭 301이나 302 리다이렉트를 해서 HTTPS를 사용하게 한 후 이 헤더를 넣자(둘 다 넣어도 상관은 없지만 HTTPS에서 이 헤더를 꼭 한 번은 받아야 한다).
2014/08/02 추가:
STS를 적용하게 되면 해당 도메인에 대한 모든 HTTP 연결이 포트와 관계없이 HTTPS로 전환된다.
다른 포트에서 테스트 앱을 돌리거나 할 때는 IP를 이용해 접속하거나 해야 SSL 오류등이 뜨지 않는다.