HTTP(HyperText Tranfer Protocol)
HTTP 란?
- 웹에서 HTML 등을 주고 받기 위한 프로토콜
- TCP 기반이며 80번 포트 사용
- ISO 7계층, TCP/IP 계층의 응용계층
- Stateless(무상태) 프로토콜 : 각 각의 request가 서로 연관 없고 독립적임
- 클라이언트-서버 모델 : 클라이언트는 요청을 하고 서버는 응답을 한다
ㅁ URL 전체문법
scheme://[user@]host[:port]/path?query#fragment
- scheme : 주로 프로토콜 입력
- user : 사용자 정보를 포함할 때 사용, 거의 사용하지 않음
- host : 호스트명, 도메인, IP주소 입력
- port : 포트번호, 프로토콜을 사용하기 때문에 생략가능
- path : 리소스의 경로
- query : 쿼리 파라미터
- fragment : 내부 북마크로 사용, 서버로 전송되지 않음
1. HTTP Request 메시지
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
(1) start line
- 메서드
- GET : 존재하는 자원을 요청(Read)
- query를 통해 데이터 전달
- POST : 새로운 자원을 생성(Create)
- 메시지 바디를 통해 데이터 전달
- PUT : 존재하는 자원을 변경(Update)
- 자원이 이미 존재하면 대체(덮어씌움), 존재하지 않으면 생성
- PATCH : 존재하는 자원을 부분변경(Update)
- PUT보다 나중에 생김
- DELETE : 존재하는 자원을 삭제(Delete)
- HEAD : GET과 동일하지만 바디 부분을 제외하고 상태줄과 헤더만 반환
- OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)를 설명, 주로 CORS에서 사용
- GET : 존재하는 자원을 요청(Read)
- path
- URI를 사용
- ex) /notice/10?a=b&x=y
- HTTP 버전
- 통상적으로
HTTP/1.1
버전이 대중화 되어있다. -
HTTP/2
,HTTP/3
은 성능개선
- 통상적으로
(2) headers
- field-name은 대소문자 구분 X ex) Host = HOST
- value는 대소문자 구분 O
- field-name과 클론 사이에 띄어쓰기가 없어야 한다 ex) Host: ~~~~
- Host : 호스트명
- 협상
- accept : 클라이언트가 선호하는 미디어타입
- accept-language : 클라이언트가 선호하는 자연 언어, 우선순위 설정가능 (q파라미터 생략시 1)
accept-language: ko-KR,en;q=0.8
- accept-charset : 클라이언트가 선호하는 문자인코딩
- accept-encoding : 클라이언트가 선호하는 압축인코딩
- 정보
- referer : 이전 웹페이지 주소
- user-agent : 클라이언트 애플리케이션 정보(브라우저 등)
- host : 필수, 요청할 호스트 정보(도메인)
- 쿠키
- cookie : 쿠키데이터
- 캐시
- if-modified-since : 브라우저가 갖고있는 캐시의 최종 수정날짜
(3) body
- 실제 전송되는 데이터
- request 메시지는 body가 없는 경우가 많다.
2. HTTP Response 메시지
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 1523
<html>
<body>...</body>
</html>
(1) start line
- HTTP버전, HTTP 상태코드/메시지
(2) headers
- HTTP 전송에 필요한 부가정보가 담긴다
- 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청클라이언트 정보, 서버 애플리케이션 정보, 캐시관리 정보 등
- 표현
- content-type : 표현 데이터의 형식 (text/html, application/json, image/png 등),
- content-length : 표현 데이터 길이, byte
- content-encoding : 압축시 타입 (gzip, deflate, identity)
- content-language : 자연언어 표시 (ko, en, en-US)
- 정보
- server : 응답하는 웹서버
- date : 발생시간
- 쿠키
- set-cookie : 쿠키데이터 설정
- 캐시
- cache-control : 캐시옵션 설정 (max-age, no-cache, no-store)
- last-modified : 최종 수정날짜
(3) body
- 실제 전송되는 데이터
- HTML 문서, 이미지, 영상, JSON 등 byte로 표현할 수 있는 모든 데이터
HTTP 상태코드
- 100번대 - 정보 응답
- 잘 사용되지 않음
- 200번대 - 성공 응답
- 200 OK
- 201 Created : 요청 성공으로 새로운 리소스 생성, Location 헤더를 갖음
- 202 Accepted : 요청이 접수되었으나 처리가 아직 완료되지 않음
- 204 No Content : 요청을 성공적으로 수행했지만 응답 본문에 보낼 데이터가 없음 ex) save 버튼클릭
- 300번대 - 요청완료를 위해 추가작업 필요, Location 헤더가 있으면 그 위치로 리다이렉트
- 영구 리다이렉션 : 요청 URI가 영구적으로 이동
- 301 Moved Permanently : 리다이렉트시 GET
- 308 Permanent Redirect : 리다이렉트시 요청메서드 유지
- 일시 리다이렉션 : 요청 URI가 일시적으로 이동
- 302 Found : 리다이렉트시 GET
- 303 See Other : 리다이렉트시 GET(무조건 변경됨)
- 307 temporary Redirect : 리다이렉트시 요청메서드 유지
- 캐시 리다이렉션
- 304 Not Modified : 클라이언트에게 리소스가 수정되지 않았음을 알림 -> 저장된 캐시를 재사용한다, Body부분이 없음
- 영구 리다이렉션 : 요청 URI가 영구적으로 이동
- 400번대 - 클라이언트 에러
- 400 Bad Request : 잘못된 요청으로 서버가 처리할 수 없음
- 401 Unauthorized : 인증이 필요함
- 403 Forbidden : 서버가 승인거부
- 404 Not Found : 요청 리소스가 서버에 없음
- 500번대 - 서버 에러
- 500 Internal Server Error
- 503 Service Unavailable : 서비스 이용 불가 (일시적 과부하 or 예정된 작업)
POST와 PUT의 차이
(1) 공통점
- 자원을 생성하는 역할 (PUT의 경우 기존에 존재하지 않을 시 생성함)
(2) 차이점
- POST
- 클라이언트가 등록될 리소스의 URI를 몰라도 된다. (서버가 새로 등록된 리소스 URI를 생성)
- 멱등성이 없음 : 요청이 2번 들어오면 자원이 2번 생성된다
# request
POST /members
# response
HTTP/1.1 201 Created
Location: /members/100
- PUT
- 클라이언트가 직접 리소스의 URI를 지정해야 한다.
- 멱등성이 있음 : 여러번 요청이 들어와도 1번으로 인식된다
# request
PUT /files/star.jpg
HTML 폼 사용
- GET, POST 메서드만 존재
- 컨트롤 URI(동사로 된 리소스 경로)를 사용해야 한다.