01DEFINITION
한 줄로 말하면
브라우저는 서버가 알려준 파일 형식이 미덥지 않으면 내용을 들여다보고 스스로 판단합니다. 이 추측이 업로드된 이미지 파일을 스크립트로 해석해 실행해 버리는 사고로 이어집니다. nosniff 는 그 추측 자체를 금지합니다. 파일 업로드를 받는 사이트에서 특히 중요하고, 부작용이 사실상 없어서 보안 헤더 중 가장 먼저 켤 만한 항목입니다.
02RISK
없으면 무슨 일이 생기나
파일 업로드를 받는 사이트가 표적입니다. 공격자는 겉보기에 이미지인 파일 안에 스크립트를 심어 올립니다. 서버가 그 파일을 이미지로 알려 주더라도, 브라우저가 내용을 들여다보고 이건 HTML 같은데 하고 판단해 버리면 그 순간 스크립트가 우리 도메인의 권한으로 실행됩니다. 업로드 검사를 통과한 파일이 실행되는 것이라 사이트 쪽에서는 아무 이상 신호가 없습니다.
우리 도메인에서 실행된다는 점이 핵심입니다. 같은 도메인이므로 로그인 쿠키에 접근할 수 있고, 우리 사이트의 다른 페이지를 호출할 수 있습니다. 외부 사이트에 올라간 악성 파일과는 위험의 급이 다릅니다.
업로드가 없어도 완전히 무관하지는 않습니다. 확장자와 실제 내용이 다른 파일이 섞여 있는 오래된 사이트에서는, 브라우저마다 다르게 해석해 어떤 브라우저에서만 화면이 이상해지는 문제가 생깁니다. 형식을 명확히 하는 것이 결국 예측 가능한 동작을 만듭니다.
03CHECK IT YOURSELF
직접 확인하는 방법
아래는 저희를 거치지 않고 지금 해 보실 수 있는 방법입니다. 결과를 저희에게 보내실 필요도 없습니다.
-
01
헤더가 있는지 본다
값은 nosniff 하나뿐이고 다른 값은 없습니다. 있으면 통과, 없으면 이 항목에 걸립니다.
$ curl -sI https://example.com/ | grep -i x-content-type-options x-content-type-options: nosniff
-
02
업로드 경로에도 붙는지 확인한다
정작 중요한 것은 업로드된 파일이 나가는 경로입니다. 전역 설정을 걸어 두어도 업로드 디렉터리에 별도 설정 파일이 있어 덮이는 경우가 있습니다.
$ curl -sI https://example.com/data/file/board/sample.jpg | grep -i x-content-type
-
03
형식이 잘못 지정된 파일이 있는지 미리 본다
CSS 나 자바스크립트 파일의 Content-Type 이 text/plain 이나 다른 값으로 나가고 있으면, nosniff 를 켜는 순간 그 파일이 적용되지 않습니다. 켜기 전에 주요 정적 파일의 형식을 한 번씩 확인하십시오.
$ curl -sI https://example.com/theme/makesite/css/makesite.css | grep -i content-type content-type: text/css
04HOW TO FIX
고치는 방법
서버 환경에 따라 적을 자리가 다릅니다. 아래는 가장 흔한 구성 기준이고, 적용 전에 현재 설정을 백업하십시오.
문서 루트의 설정에 넣으면 전 경로에 적용됩니다. always 를 붙여야 오류 응답에도 붙습니다.
Header always set X-Content-Type-Options "nosniff"
add_header 는 하위 블록에서 다시 선언하면 상위 것이 전부 사라집니다. server 블록에 add_header 가 이미 있다면 그 자리에 같이 적으십시오.
add_header X-Content-Type-Options "nosniff" always;
nosniff 를 켠 뒤 스타일이 적용되지 않거나 스크립트가 실행되지 않는다면, 그 파일의 Content-Type 이 잘못 지정돼 있는 것입니다. 서버의 형식 매핑을 고치는 것이 맞는 조치이고, nosniff 를 다시 끄는 것은 문제를 덮는 것입니다.
AddType text/css .css AddType application/javascript .js AddType image/svg+xml .svg
헤더만으로는 충분하지 않습니다. 업로드 원본을 웹에서 직접 열 수 없는 위치에 두고 스크립트를 거쳐 내보내는 구조가 근본적인 해결입니다. 저희도 업로드 원본을 문서 루트 밖에 두고 서명된 주소로만 내보냅니다.
05FAQ
자주 묻는 질문
nosniff 를 켰더니 CSS 가 적용되지 않습니다
- CSS 파일이 text/css 가 아닌 형식으로 나가고 있다는 뜻입니다. 브라우저가 그동안 내용을 보고 알아서 CSS 로 취급해 주고 있었던 것입니다. 서버의 형식 매핑을 고치면 해결되며, 이 상태를 발견한 것 자체가 이 헤더의 효용입니다.
업로드 기능이 없는 소개 사이트에도 필요한가요
- 필요합니다. 위험도는 낮지만 설정 비용이 한 줄이고 부작용이 없어서, 넣지 않을 이유를 찾기가 더 어렵습니다. 또 나중에 게시판이나 문의 첨부 기능을 붙일 때 이미 켜져 있는 편이 안전합니다.
Content-Type 을 정확히 지정하면 이 헤더 없이도 되나요
- 이론적으로는 그렇지만 실무에서는 권하지 않습니다. 사이트에는 우리가 만들지 않은 파일이 계속 늘어나고, 플러그인이나 게시판 스킨이 내보내는 응답까지 전부 통제하기는 어렵습니다. nosniff 는 그 전부에 한 번에 적용되는 안전장치입니다.
이미지 파일도 nosniff 의 영향을 받나요
- 받습니다. 그리고 그것이 이 헤더의 주된 목적입니다. 이미지로 선언된 파일은 이미지로만 취급되므로, 그 안에 무엇이 들어 있든 스크립트로 실행되지 않습니다. 정상적인 이미지는 아무 영향도 받지 않습니다.
GET STARTED
내 사이트는
이 항목을 통과할까요
주소만 넣으시면 이 항목을 포함해 25가지를 판정해 점수와 실패 개수를 보여 드립니다. 로그인도, 소유 확인도 필요 없습니다 — 전부 밖에서 관찰만 하는 항목이기 때문입니다.