- 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-Type : 표현 데이터의 형식
- 표현헤더
- 콘텐츠 협상(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 : 메시지가 발생하는 날짜와 시간
- 응답에서 사용
- From : 유저 에이전트의 이메일 정보
- 특별한 정보
- 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) : 서비스가 언제까지 불능인지 알려줄 수 있음
- Host : 요청한 호스트 정보(도메인)
'Learning-log > Spring & JPA' 카테고리의 다른 글
(스프링MVC1편-백엔드 웹 개발 핵심 기술) 1-(1) 웹 서버, 웹 애플리케이션 서버, (2) 서블릿 (0) | 2023.04.28 |
---|---|
(모든 개발자를 위한 HTTP 웹 기본 지식) 8-(3)~(6) HTTP 헤더2-캐시와 조건부 요청 (0) | 2023.04.27 |
(모든 개발자를 위한 HTTP 웹 기본 지식) 6-(1)~(5) HTTP 상태코드 (0) | 2023.04.22 |
(모든 개발자를 위한 HTTP 웹 기본 지식) 5-(1)~(2) HTTP메서드 활용 (0) | 2023.04.20 |
(모든 개발자를 위한 HTTP 웹 기본 지식) 4-(1)~(5) HTTP메서드 (0) | 2023.04.19 |