HTTP 헤더 분석

2022년 10월 04일

TOC

Network

브라우저의 Http(Hyper Text Transfer Protocol) 헤더에서 서버와 클라이언트의 요청, 응답 과정에서 전송한 부가 정보를 확인할 수 있다.

HTTP란?

HTTP(Hyper Text Transfer Protocol) 라는 영문 그대로 인터넷에서 하이퍼텍스트를 빠르게 교환하기 위한 프로토콜의 일종이다. 여기서 하이퍼텍스트는 링크를 통해 다른 문서로 이동할 수 있게 해주는 텍스트, 하이퍼링크를 나타내는 텍스트를 의미한다.

HTTP는 OSI 7계층 중에 응용 계층(Application layer)의 프로토콜이며, TCP/IP Suite 위에서 작동한다. (OSI계층과 관련된 자세한 내용은 OSI_모형 참고.) HTTP는 인터넷 할당 번호 관리 기관(IANA)의 가이드라인에 의거하여 80번 포트를 사용하며, 요청(Request)과 응답(Response)으로 구성되어 데이터를 주고받는다. 클라이언트가 80번 포트로 요청을 보내면, 서버에서 응답을 하는 방식이다.

HTTPS란?

기존의 HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이라 비밀번호 등의 개인정보를 제 3자가 조회할 수 있었다. 이러한 문제를 해결하기 위해 HTTPS가 등장하게 되었다.

HyperText Transfer Protocol over Secure Socket Layer
HTTP over TLS
HTTP over SSL
HTTP Secure

영문에서 알 수 있듯이 제 3자가 정보를 볼 수 없도록 암호화가 첨가되었다. 80번 포트가 아닌 443번 포트를 사용하며, 보안 소켓 계층(SECURE SOCKETS LAYER)을 사용한다. 이 SSL 인증서는 사용자가 사이트에서 제공하는 정보를 암호화하는데, 제 3자가 개인정보에 접근했을 경우 데이터가 이미 암호화된 상태이기 때문에 확인이 불가능하다. 전송 계층 보안(Transport Layer Security) 또한 사용되는데, 클라이언트와 서버 간의 커뮤니케이션을 암호화해준다.

네트워크 헤더

브라우저 개발자 도구의 네트워크 탭에서 헤더를 확인할 수 있는데, 요청과 응답의 부가적인 정보가 명시되어 있다. 구글과 함께 국내 트래픽 1위를 다투고 있는 네이버의 헤더 내용을 분석해 보았다.

헤더는 일반, 응답, 요청 3가지로 분류되어 있다.

▾ 일반

요청 URL: https://www.naver.com/
요청 메서드: GET
상태 코드: 200
원격 주소: xxx.xxx.xxx.xxx:xxx
리퍼러 정책: unsafe-url

요청 URL : 페이지의 URL.

요청 메서드 : 해당 주소에 대한 동작(GET, POST, PUT, PATCH, DELETE 등등...).

상태 코드 : 응답 상태를 3자리 숫자로 표시.

  • 1xx(Information Responses) : 요청을 받았으며 프로세스를 계속 진행.
  • 2xx(Successful Responses) : 요청을 성공적으로 받았으며 인식했고 수용.
  • 3xx(Redirection Messages) : 요청 완료를 위해 추가 작업 조치가 필요.
  • 4xx(Client Error Responses) : 요청의 문법이 잘못되었거나 승인 실패.
  • 5xx(Server Error Responses) : 서버가 명백히 유효한 요청에 대한 충족 실패.

원격 주소 : 도메인이 해석되고 브라우저에 의해 어떤 서버와 소통할지 알기 위해 사용되는 IP 주소.

리퍼러 정책(Referrer-Policy) : 정책에 따라 페이지의 Referrer 데이터의 양을 제한.

  • no-referrer : 전송된 요청에 리퍼러 정보가 포함되지 않음.
  • no-referrer-when-downgrade : 프로토콜 보안 레벨이 동일하거나 향상될 경우

    • (HTTP -> HTTP, HTTPS -> HTTP)
  • origin : 도메인 정보만 전송.
  • origin-when-cross-origin : 웹사이트가 같을 경우 전체, 다를 때는 도메인 주소만 전송.
  • same-origin : 웹사이트가 같을 경우 전체 주소를 전송.
  • strict-origin : 프로토콜 보안 레벨이 동일할 때만 전송.
  • strict-origin-when-cross-origin : 보안 레벨 동일, 웹사이트가 같을 경우 전송.
  • unsafe-url : 보안과 관계 없음.  

    ▾ 응답 헤더

    cache-control: no-cache, no-store, must-revalidate content-encoding: gzip content-type: text/html; charset=UTF-8 date: Tue, 04 Oct 2022 09:55:10 GMT p3p: CP="CAO DSP CURa ADMa TAIa PSAa OUR LAW STP PHY ONL UNI PUR FIN COM NAV INT DEM STA PRE" pragma: no-cache referrer-policy: unsafe-url server: NWS strict-transport-security: max-age=63072000; includeSubdomains x-frame-options: DENY x-xss-protection: 1; mode=block

cache-control : 캐시 관리에 대한 여러 정책을 제공.

  • no-cache : 캐시가 유효한지 확인하기 위해 매번 서버에 요청.
  • no-store : 어떤 요청도 캐시로 저장하지 않음.
  • must-revalidate : no-cache 정책을 프록시 서버에게 요청.

content-encoding : 원본 미디어 유형에 대한 정보를 잃지 않고 메시지 데이터를 압축하는 데 사용. gzip, compress, deflate, br 등이 있음.

content-type : 원본 미디어 유형을 명시. UTF-8의 경우 최근 가장 통상적인 인코딩 방식이다.

date : HTTP 메시지가 만들어진 시각.

p3p : 프라이버시 보호정책을 전달하는 기준을 제공.

pragma : HTTP/1.0의 유물. cache-control 역할과 동일.

server : 응답 서버.

strict-transport-security : HTTP로 액세스하여 보안에 문제가 생기게 되는 상황을 방지.

  • max-age : strict-transport-security가 브라우저에 설정될 시간.
  • includeSubdomains : 서브 도메인까지 확장 적용함.

x-frame-options : 클릭 재킹(Click Jacking)을 이용한 공격을 막아주는 역할.

  • DENY : 무조건 frame을 화면에 띄우지 않음.
  • SAMEORIGIN : 같은 도메인의 경우 frame 가능.
  • ALLOW-FROM https://www.example.com/ : 신뢰할 수 있는 출처인 경우 가능.

클릭 재킹(Click Jacking)이란?

HTML 삽입 취약점이 존재할 경우 iframe과 같은 태그를 삽입하여 사용자의 의도와 다른 클릭 이벤트를 실행시키거나, 순간적으로 수백, 수천 개의 request를 발생시켜 디도스를 발생시킬 수 있는 해킹 기법.

x-xss-protection : 위의 클릭 재킹(Click Jacking) 공격을 감지했을 경우 페이지 로드를 중지하는 기능을 가짐. 그러나 현재 비표준으로 분류되어 향후 변동 가능성이 있음.

 

▾ 요청 헤더

:authority: www.naver.com
:method: GET
:path: /
:scheme: https
accept: text/html,application/xhtml+xml,application/xml;q=0.9,
accept-encoding: gzip, deflate, br
accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
cache-control: max-age=0
cookie: NNB=OOOOOOOOOOOOO; (생략)
referer: https://www.naver.com/
sec-ch-ua: "Google Chrome";v="105", "Not)A;Brand";v="8",
    "Chromium";v="105"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
            AppleWebKit/537.36 (KHTML, like Gecko)
            Chrome/105.0.0.0 Safari/537.36

accept : 요청을 보낼 때 데이터의 타입(MIME)을 명시할 때 사용.

accept-encoding : 원본 미디어 유형 압축 방식.

cookie : 서버로부터 받은 쿠키를 다시 서버에게 전송.

sec-ch-ua : user-agent의 버전 정보를 제공. (user-agent에 대한 내용은 하단 참조.)

sec-ch-ua-mobile : 브라우저가 모바일 장치에 있는지에 대한 여부.

sec-ch-ua-platform : user-agent가 실행 중인 플랫폼 또는 운영 체제를 제공.

sec-fetch-dest : 요청의 대상을 의미, document이면 HTML 문서의 최상위 탐색 결과.

sec-fetch-mode : 요청 모드를 설정.

  • cors : 교차 출처 리소스 공유(cors). 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 체제.
  • no-cors : 메소드가 HEAD, GET또는 POST, 헤더가 아닌 다른 헤더가 되지 않도록 함.
  • navigate : 탐색 지원 모드. 탐색 요청은 문서를 탐색하는 동안 생성됨.
  • websocket : WebSocket 연결을 설정할 때만 사용되는 특수 모드.

sec-fetch-site : 요청 개시자의 출처와 요청된 리소스의 출처 간의 관계.

sec-fetch-user : 사용자 활성화에 의해 시작된 요청에 대해서만 전송. 값이 항상 ?1이다.

upgrade-insecure-requests : 암호화되고 인증된 응답에 대한 클라이언트의 기본 설정과 CSP 지시문을 성공적으로 처리할 수 있음을 나타내는 신호를 서버에 전송.

user-agent : HTTP 요청을 보내는 디바이스, 브라우저 등의 사용자 소프트웨어 식별 정보.


Reference

HTTP - ZeroCho Blog

HTTP 상태 코드 정리 | 와탭 블로그

TLS란? | 네트워크 보안 프로토콜 | Cloudflare

HTTP 프로토콜 ~ CS_Bank

HTTP | MDN

Written by

yhuj79

🌱 Junior Developer