안녕하세요. 이번 시간에는 X-로 시작하는 헤더들에 대해서 알아보겠습니다.
지금까지 많은 유명한 헤더들을 알아보았는데요. X-로 시작하는 헤더들은 무슨 의미를 갖고 있는지 궁금하셨을 것입니다. 예전에 사용자가 임의로 헤더를 정의할 때, 사용자가 정의한 헤더라는 것을 알려주기 위해 앞에 X-를 붙이곤 했습니다. 하지만 2012년에 임의라는 의미는 사라졌고요. 이제는 사용자 정의 헤더도 X-를 앞에 붙이지 않아도 됩니다(하지만 많은 사람들, 그리고 구글마저 습관적으로 X를 앞에 붙이더라고요 ㅎㅎ).
그래도 예전에는 규칙이었기 때문에 X-를 붙인 헤더들을 많이 보실 수가 있고요. 그 중 몇 헤더들은 너무 널리 쓰인 나머지 사실상 표준 헤더가 되어버렸습니다. 그래서 X- 규칙은 사라졌지만, X-가 앞에 붙은 헤더들 중 유명한 것들은 알아두시는 게 좋습니다.
X-Forwarded-For, X-Forwarded-Host, X-Forwarded-Proto
요청이 어디서부터 건너왔는지 알려주는 헤더입니다. 실제 세상에서는 클라이언트(요청) - 서버(응답)와 같은 2단 구조보다는 클라이언트(요청) - 중개 서버 - 중개 서버 - 중개 서버 - ... - 최종 서버(응답) 이런 다단 구조가 더 많습니다.
이 때 중개 서버를 거치면서 헤더들이 변조되고, 요청을 누가 보냈는지 애매해지기도 하는데요. X-Forwarded 헤더 시리즈는 원래 요청이 누구였는지를 밝혀줍니다(물론 이것도 조작할 수 있으니 완전히 믿어서는 안 됩니다).
X-Forwarded-For: 1.2.3.4, 5.6.7.8, 9.10.11.12
X-Forwarded-Host: www.zerocho.com
X-Forwarded-Proto: https
For는 현재까지 거쳐온 서버의 IP에 대한 정보를 가지고 있습니다. 1.2.3.4가 원래 서버 아이피라면 나머지는 중개 서버 아이피가 됩니다. Host는 원래 서버의 호스트명이고요. Proto는 원래 서버의 프로토콜이 되죠.
사실 Forwarded 헤더가 표준 헤더입니다. 위 세 가지를 모두 처리할 수 있습니다.
Forwarded: for=1.2.3.4; host=www.zerocho.com; proto=https; by=5.6.7.8, 9.10.11.12
X-Frame-Options
frame, iframe, object 태그 안에서 페이지를 렌더링하는 것을 막을 수 있습니다. 여러분의 사이트가 frame, iframe, object를 안 쓴다면
X-Frame-Options: DENY
로 막아두는게 보안에 좋습니다. 클릭재킹(내가 무언가를 눌렀는데, 실제로는 그게 아니라 다른 게 눌리는 해킹 방법)을 막을 수 있다고 하네요. 만약 여러분의 사이트 자체를 iframe 등으로 불러오는 경우에는
X-Frame-Options: SAMEORIGIN
으로 자신의 페이지를 불러오는 것은 허용할 수 있습니다.
특정한 사이트 불러오는 것만 허용하고 싶다면
X-Frame-Options: ALLOW-FROM https://www.zerocho.com
와 같이 명시해주면 됩니다.
X-Content-Type-Options
서버에서 보내온 Content-Type 헤더가 잘못 설정되었다고 생각하는 경우, 브라우저는 자체적으로 컨텐츠 타입을 추론합니다. 예를 들어 분명히 css파일인데 Content-Type 헤더가 text/html인 경우, 브라우저가 text/css로 추론할 수도 있다는 뜻입니다. 하지만 이런 임의적 행동은 예상치 못한 행동이기 때문에 위험할 수 있습니다. 그럴 때는
X-Content-Type-Options: nosniff
헤더를 서버에서 보내주어, 브라우저가 서버가 보낸 컨텐츠타입을 따르게 강제할 수 있습니다.
이렇게 유명한 X 헤더들에 대해 알아봤습니다. 이제는 X 헤더를 봐도 신기하게 쳐다보지 마시고, 그냥 저런 게 있었지 하면서 넘어가시면 됩니다.
지금까지 공통 헤더, 요청 헤더, 응답 헤더, 쿠키&캐싱 헤더부터 오늘 다룬 X 헤더까지 알아보았습니다. 혹시나 추가적으로 궁금한 헤더가 있다면 댓글로 달아주세요~. 이상으로 HTTP 강좌를 마칩니다!(라고 해놓고 마지막 강좌가 아닐 수도 있습니다. 소재를 찾아서 돌아오겠습니다.)