HTTP 메시지 구조

시작 라인
- 요청 : HTTP메서드, 요청 대상, HTTP버전
- 응답 : HTTP버전, HTTP 응답 코드(200 성공, 400 클라이언트 요청 오류, 500 서버 오류), 이유 문구
헤더
- HTTP 메시지 전송을 위해 필요한 부가정보들
- 압축, 인증, 쿠키, 클라이언트의 정보, 캐시 관리, 메시지 바디의 길이/형식 등등
바디
- 실제로 전송할 데이터
- Byte로 표현할 수 있는 모든 데이터를 전송할 수 있음 (HTML, 이미지, 영상, JSON, XML, TEXT)
HTTP메서드
- GET : 리소스를 조회,? 와&를 활용한 쿼리 파라미터로 서버에 데이터를 보냄(/search? q=hello&lc=ko), HTTP메시지 바디를 사용하지 않음
- POST : 요청 데이터를 처리(주로 등록), HTTP메시지 바디를 사용하여 서버에 데이터를 보냄, HTMP Form처리, 게시글/댓글 작성, 리소스 생성(상품등록), 다른 HTTP메서드로 처리하기 애매한 경우 POST로 처리함
- PUT : 특정 리소스가 있으면 덮어쓰고, 없으면 새로 생성함, 특정 리소스에 대해 작동하므로 클라이언트가 리소스를 식별해줘야 함
- PATCH : 특정 리소스 부분 변경
- DELETE : 특정 리소스 삭제
클라이언트 → 서버 데이터 전달 방법
1. 쿼리 파라미터 : GET (검색, 정렬 등)
2. 메시지 바디에 넣어서 : POST, PUT, PATCH (상품 등록/주문, 리소스 등록/변경, 회원 가입)
1) 정적 데이터를 조회 : 텍스트, 이미지
2) 동적 데이터 조회 : 게시글, 검색, 쿼리 파라미터 사용
3) HTML Form 전송 : POST로 전송, 메시지 파디에 쿼리 파라미터가 들어감(GET의 쿼리 파라미터와 형식 동일함 = Content-Type: application/x-www-form-urlencoded), 회원가입, 주문
4) HTTP API : 메시지 바디 활용, 서버 to서버 통신, Ajax, 주로 JSON을 많이 사용(Content-Type: application/json)
HTTP 상태 코드
1xx : 처리 중
2xx : 정상 처리
200 | 요청 성공 (특정 데이터 조회 성공) GET |
201 | 새로운 리소스 생성 완료 POST, Location헤더로 위치 알려줌 |
202 | 요청 접수했으나, 미처리 중, 배치처리 |
204 | 요청은 성공, 응답 페이로드 본문에 보낼 데이터 없음, 문서 저장버튼 |
3xx : 리다이렉션, 응답 메시지의 헤더에 Location이 있으며 Location에 지정된 위치로 이동함
ex )
HTTP/1.1 301 Moved Permanently
Location : /new-page
=> /new-page를 서버에 GET 요청하여 이동함
300 | Multiple Choices, 안씀 |
301 | Moved Permanently, 영구적으로 이동, redirect시 GET요청 |
302 | Found, 일시적으로 이동, redirect시 GET요청, 많이 사용 |
303 | See Other, 일시적으로 이동, redirect시 GET요청 |
304 | Not Modified, 캐시, 리소스가 수정되지 않았음을 클라이언트에 알려줌 => 클라이언트는 캐시로 리다이렉트 |
307 | Temporary Redirect, 일시적으로 이동, redirect시 HTTP메서드 본문 유지 |
308 | Permanent Redirect, 영구적으로 이동, redirect시 HTTP메서드 본문 유지 |
PRG : POST > REDIRECT > GET
- 상품 등록(POST) 후, 새로고침해서 또 POST를 날리면 중복 등록이 될 수 있음
- PRG : 상품 주문 후, 주문 상세 화면으로 Redirect 시킨 후, GET 요청
4xx : 클라이언트 요청 오류
400 | Bad Request, 요청 구문 오류, 잘못된 API요청 |
401 | Unauthorized, 인증X, WWW-Authenticate헤더로 인증방법 설명 |
403 | Forbidden, 접근 권한 없음 |
404 | Not Found, 요청한 리소스가 서버에 없음, 클라이언트에 숨길 리소스 |
5xx : 서버 내부 오류
500 | Internal Server Error, 대부분 이거 사용 |
503 | Service Unavailable, 일시적인 사용 불가 |
HTTP 헤더
- HTTP 메시지 전송을 위해 필요한 부가정보들
- 압축, 인증, 쿠키, 클라이언트의 정보, 캐시 관리, 메시지 바디의 길이/형식 등등
표현 | Content-Type | 표현 데이터(메시지 바디) 형식, 미디어 타입, 문자 인코딩 | text/html; charset=utf-8, application/json, image/png |
Content-Encoding | 표현 데이터 압축 방식, 주는 쪽은 압축 후 헤더 추가 → 받는 쪽은 인코딩 헤더 정보로 압축 해제 |
gzip, deflate, identity | |
Content-Language | 표현 데이터 언어 | ko, en, en-US | |
Content-Length | 표현 데이터 길이, Byte단위 | Content-Length: 123 | |
협상 (요청만) |
Accept | 클라이언트가 선호하는 미디어 타입 전달, 구체적인게 우선순위 높음 |
text/*, text/plain, */* |
Accept-Charset | 클라이언트가 선호하는 문자 인코딩 | ||
Accept-Encoding | 클라이언트가 선호하는 압축 인코딩 | ||
Accept-Language | 클라이언트가 선호하는 자연 언어 q는 우선순위(0~1, 클수록 높음) |
ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 | |
전송 방식 |
Content-Length | 단순 전송, 전달하는 HTTP 메시지 바디 데이터의 길이 | Content-Length: 123 |
Contect-Encoding | 압축 전송 | Content-Encoding: gzip | |
Transfer-Encoding | 분할 전송 | Transfer-Encoding: chunked | |
Content-Range | 범위 전송 | Content-Range: bytes 1001~2000 / 2000 | |
일반 정보 |
From | 유저 에이전트의 이메일 | |
Referer | 이전 웹 페이지 주소, 유입 경로 분석 가능, 요청만 | ||
User-Agent | 유저 에이전트 애플리케이션 정보, 요청만 | user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.54 |
|
Server | 요청을 처리하는 서버의 SW정보, 응답만 | Server: nginx | |
Date | 메시지 생성일, 응답만 | ||
특수 정보 |
Host | 요청을 한 도메인 정보, 한 서버에 여러 도메인 | Host: www.naver.com |
Location | 리다이렉션 | ||
Allow | 허용하는 HTTP 메서드 | ||
Retry-After | 사용자가 다음 요청까지의 대기해야하는 시간 | ||
인증 | Authorization | 클라이언트의 인정 정보를 서버에 전달함 | |
WWW-Authentication | 리소스 접근시 필요한 인증 방법 | ||
쿠키 | Cookie | 클라이언트가 쿠키저장소에서 쿠키를 서버에 전달 | Cookie: userid=ABC |
Set-Cookie | 서버가 클라이언트에게 쿠키 전달 expired : 쿠키 만료일 max-age : 쿠키 유효 시간 (초) |
Set-Cookie: userid=ABC |
'WEB > http' 카테고리의 다른 글
[HTTP] 퍼센트 인코딩/URLEncoder (0) | 2021.07.01 |
---|