본문 바로가기
Learning-log/Spring & JPA

(모든 개발자를 위한 HTTP 웹 기본 지식) 7-(1)~(6) HTTP 일반헤더

by why제곱 2023. 4. 23.

- HTTP 헤더 개요

  • HTTP헤더
    • header-field = field-name ":" OWS field value OWS (OWS : 띄어쓰기 허용)
    • field name은 대소문자 구분 없음
    • 용도
      • HTTP 전송에 필요한 모든 부가정도
      • 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보 등 많은 정보가 들어감
      • 표준 헤더가 너무 많음
      • 필요 시 임의의 헤더 추가 가능
    • 헤더 분류
      • General헤더 : 메시지 전체에 적용되는 정보  ex . Connection : close
      • Request헤더 : 요청 정보 ex. 
      • Response 헤더 : 응답 정보  ex. Server : Apache(요청을 받아서 처리하는 서버 정보)
      • Entity헤더 : 엔티티 바디 정보 ex. Content-Type : text/html, Content-Length : 3423
    • HTTP BODY(과거) , 메시지 본문이라고 부름
      • 메시지 본문은 엔티티본문을 전달하는 데에 사용됨
      • 엔티티 본문은 요청이나 응답에서 전달할 실제 데이터
      • 엔티티 헤더는 엔티티 본문의 데이터를 해석할 수 있는 정보 제공
        • 데이터 유형, 데이터 길이, 압축 정보 등
    • HTTP 표준이 바뀌면서 엔티티 대신 표현이라는 것이 들어옴. 표현 = 표현 메타데이터 + 표현
    • HTTP BODY(최신, RFC7230)
      • 메시지 본문을 통해 표현 데이터 전달
      • 메시지 본문 = 페이로드라 부름
      • 표현은 요청이나 응답에서 전달할 실제 데이터
      • 표현 헤더는 표현데이터를 해석할 수 있는 정보 제공
        • 데이터유형(html, json), 데이터 길이, 압축 정보 등등
      • 참고 : 표현 헤더는 표현 메타 데이터와 페이로드 메시지를 구분해야 하지만 이러면 너무 복잡해짐 .  
        •  표현헤더
          • Content-Type : 표현 데이터의 형식
            • 리소스를 어떤 데이터 표현으로 전달할 것인가 
            • 리소스를 클라이언트와 서버 간에 주고받을 때는 서로 이해할 수 있는 무언가로 변환해서 데이터를 전달. 데이터베이스의 바이너리를 그대로 전달할 순 없으므로!
            • 미디어 타입, 문자 인코딩(컨텐트 바디에 들어가는 내용이 무엇인가 !!)
              • text/html; charset=utf-8
              • application/json
              • image/png
          • Content-Encoding : 표현 데이터의 압축방식
            • 표현 데이터를 압축하기 위해 사용
            • 데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가
            • 데이터를 읽는 쪽에서 인코딩 헤더의 정보로 압축 해제
              • gzip
              • deflate
              • identity
          • Content-Language : 표현 데이터의 자연언어
              • ko
              • en
              • en-US
          • Content-Length : 표현 데이터의 길이
            • 바이트 단위
            • Transfer-Encoding(전송코딩)을 사용하면 Content-Length를 쓰면 안 됨.
          • 표현 헤더는 전송, 응답 둘다 사용 가능
    • 콘텐츠 협상(Content Negotiation)
      • 클라이언트가 원하는 표현으로 달라고 서버에 요청 . 줄 수 있으면 이걸로 줘라!!
      • Accept : 클라이언트가 선호하는 미디어 타입 전달
      • Accept-Charset : 클라이언트가 선호하는 문자 인코딩
      • Accept-Encoding : 클라이언트가 선호하는 압축 인코딩
      • Accpet-Language : 클라이언트가 선호하는 자연 언어
      • 협상 헤더는 요청 시에만 사용
      • Accept-Language 사용 전
        • 한국 브라우저 사용 
          • 사용 전 : GET /event -> Content-Language-en hello(영어) 
          • 사용 후 : GET /event  Accept-Language: ko -> Content-Language: ko 안녕하세요
          • 복잡한 예시
            • 서버에서 다중 언어를 지원하는 서버이지만 영어도 지원하고 한국어는 없음
            • 나는 한국어를 선호하지만 없으면 영어가 차라리 낫다!! 는걸 표현하기 위해 우선순위 필요
      • 협상과 우선순위1 Quality Values(q)
        • Quality Values(q)값 사용
        • 0~1 클 수록 높은 우선순위
        • 생략하면 1
        • Accept-Language: ko-KR, ko;q=0.9, en-US;q=0.8, en;q=0.7
          • 1. ko-KR;q=1 (q생략)
          • 2. ko;q=0.9
          • 3. en-US;q=0.8
          • 4. en;q=0.7
      • 협상과 우선순위2 Quality Values(q)
        • 구체적인 것 우선
        • Accept: text/*, text/plain, text/plain;format=flowed, */*
          • 1. text/plain;format=flowed
          • 2. text/plain
          • 3. text/*
          • 4. */*
      • 협상과 우선순위 3
        • 구체적인 것을 기준으로 미디어 타입을 맞춤
        • Accept: text/*;q=0.3, text/html;q=0.7, text/html;level=1; text/html;level=2; q=0.4, */*;q=0.5
  • 전송방식
    • 단순 전송 : 요정하면 응답 줌. 
      • Content-Length 지정
    • 압축 전송 : 서버에서  gzip같은 걸로 압축해서 전송. Content-Encoding 꼭 넣어야 함
    • 분할 전송 (Transfer-Encoding) : chunked, 마지막에 0 \r\n 보내면  분할 전송 끝난 것
    • 범위 전송(Range, Content-Range) : 범위를 지정해서 요청
  • 일반 정보
    • From : 유저 에이전트의 이메일 정보
      • 일반적으로 잘 사용x
      • 검색 엔진 같은 곳에서 주로 사용
      • 요청에서 사용
    • Referer : 이전 웹페이지 주소
      • 많이 사용
      • 현재 요청된 웹페이지의 이전 주소
      • a->b로 이동하는 경우 b를 요청할 때 a를 referer에 포함해서 요청
      • 요청에서 사용
      • referrer의 오타 ............................................ 응.............................?
    • User-Agent
      • 유저 에이전트 애플리케이션 정보
      • 클라이언트의 애플리케이션 정보(웹 브라우저 정보 등등)
      • 통계 정보
      • 어떤 브라우저에서 장애 발생하는지 파악하기 가능
      • 요청에서 사용
    • Server
      • 요청을 처리하는 ORIGIN서버의 소프트웨어 정보
      • Server : Apache/2.2.22(Debian)
      • server : nginx
      • 응답에서 사용
    • Date : 메시지가 발생하는 날짜와 시간
      • 응답에서 사용
  • 특별한 정보
    • Host : 요청한 호스트 정보(도메인)
      • 필수값 !! 중요 !!! 
      • 요청에서 사용
      • 하나의 서버가 여러 도메인을 처리해야 할 때 구분해줌
      • 하나의 IP주소에 여러 도메인이 적용되어 있을 때
      • ip라는 주소로만 통신하니까 /hello라는 명령어가 왔을 때 a,b,c 중 어디의 hello로 연결해야하는 지 모르는 문제 발생 -> host정보를 통해 도메인을 전달해서 해결 
      •  
    • Location 
      • 페이지 리다이렉션
      • 웹 브라우저 3xx 응답의 결과에 Location 헤더가 있으면 Location 위치로 자동 이동(리다이렉트)
      • 응답코드 3xx에서 설명
      • 201 (created) Location 값은 요청에 의해 생성된 리소스 URI
      • 3xx (Redirection) : Location 값은 요청을 자동으로 리디렉션하기 위한 대상 리소스를 가리킴
    • Allow : 허용 가능한 HTTP 메서드
      • 405 : URL경로는 있는데, GET, HEAD, PUT만 제공하고 POST는 제공은 안할 때 이를 전달해줘야 함.
    • Retry-After
      • 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
      • 503(Service Unavailiable) : 서비스가 언제까지 불능인지 알려줄 수 있음