HTTP에서 보안을 조금이나마 강화시키는 헤더들

오늘 STS(Strict-Transport-Security)를 적용하려고 검색을 하다가 몇 가지 처음 보는 헤더들을 찾았다. 이 글에 자세히 설명이 나와있는데 대충 적어보면 이렇다.

1. Content-Security-Policy

누군가 페이지에 외부 스크립트 등을 걸어서 XSS 공격을 할 수 있기 때문에 페이지에서 허용할 origin을 지정할 수 있다. Content의 종류는 아래와 같다.

  1. script-src: JavaScript code (이 헤더를 사용하는 가장 큰 이유다)
  2. connect-src: XMLHttpRequest, WebSockets, and EventSource.
  3. font-src: fonts
  4. frame-src: frame ulrs
  5. img-src: images
  6. media-src: audio & video
  7. object-src: Flash (and other plugins)
  8. 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 오류등이 뜨지 않는다.

kjwon15

I'm a hacker, I want to improve life.

2 thoughts to “HTTP에서 보안을 조금이나마 강화시키는 헤더들”

  1. 안녕하세요. 글을 읽고 궁금한 점이 있어서, 답변을 달았습니다.

    저 헤더들을 어디에 적용하는 것인지 궁금합니다.

    감사합니다.

    1. 서버가 해당 헤더를 같이 첨부하여 응답을 주게 하면 됩니다.
      어떤 서버를 쓰냐에 따라 설정 방법은 다 다르겠죠.

Leave a Reply

Your email address will not be published. Required fields are marked *

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.