HTTP는 HTTP 문서와 같은 리소스들을 가져올 수 있도록 해주는 클라이언트-서버 프로토콜이다.
클라이언트-서버 프로토콜이란
수신자 측에 의해 요청이 초기화되는 프로토콜을 의미한다.
클라이언터에 의해 전송되는 메시지를 요청(request),
서버에서 응답으로 전송되는 메시지를 응답(reponse) 라고 한다.
HTTP/3전까지는 HTTP는 TCP혹은 TLS를 통해 전송되었다.
TLS
암호화된 TCP 연결
요청과 응답 사이에는 여러 개체들이 존재한다. 게이트웨이, 프록시 등.
- 사용자 에이전트 - 사용자를 대신하여 동작하는 모든 도구.
웹페이지를 표시하기 위한 절차
1. 브라우저는 페이지의 HTML문서를 가져오기 위한 요청을 전송.
2. 파일을 구문 분석하여 필요한 스크립트나 리소스나 CSS등을 가져온다.
3. 브라우저는 웹 페이지를 표시하기 위해 리소스를 혼합한다.
4. 실행된 스크립트는 이후 리소스들을 추가적으로 가져올 수 있고, 그에따라 웹 페이지를 갱신하게 된다.
HTTP의 특징
- 사람이 읽을 수 있다. (HTTP/2 이전까지.)
- HTTP 헤더로 인하여 확장과 실험에 용이하다.
- 상태를 저장하지 않는다. (쿠키를 통해 상태가 있는 세션을 만들 수 있다.)
- 신뢰할 수 있는 전송 프로토콜인 연결기반의 TCP를 사용(HTTP/3는 UDP기반의 QUIC사용.)
- 웹의 많은 기능을 제어 가능.
- 캐시
- origin 제약사항 완화
- 인증
- 프록시와 터널링
- 세션
HTTP의 흐름
- TCP 연결을 연다.
- 요청을 보내거나 응답을 받는데 사용.
- 클라이언트는 새 연결을 열거나, 기존 연결을 재사용하거나 여러 TCP를 연결하는 등 다양한 행동이 가능하다.
- HTTP 메시지 전송.
- 서버에 의해 전송된 응답을 읽어들인다.
- 연결을 닫거나 다른 요청을 위해 재사용한다.
HTTP 메시지
멱등성
동일한 요청을 한 번 보내는 것과 여러번 보내는 것이 같은 효과를 지닌 것을 뜻하는 말
요청
구성 요소
- HTTP 메서드
- 리소스 경로
- HTTP의 프로토콜 버전.
- 추가정보를 전달하는 선택적 헤더.
- 몇가지 메서드를 위한 응답의 본문과 유사한 본문.
응답
구성 요소
- HTTP 프로토콜 버전.
- 요청의 성공여부와 이유를 나타내는 상태코드.
- 상태 메시지.
- HTTP 헤더들
- 리소스가 포함되는 본문(선택적)
메서드
- GET - 특정 리소스 표시 요청. 데이터를 받기만 함.
- HEAD - GET과 동일안 응답을 요구하나, 응답 본문들 포함하지 않음.
- POST - 요청된 자원을 생성.
- PUT - 요청된 자원을 수정.(전체)
- PATCH - 리소스의 부분만 수정하는데 사용.
- DELETE - 특정 리소스 삭제.
- CONNECT - 서버로의 터널을 맺음. 보통 프록시 요청시 사용.
- TRACE - 리소스의 경로를 따라 메시지 loop-back 테스트.
- OPTIONS - 리소스의 통신을 설정하는데에 사용.
헤더
헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있게 해줌.
구성으론 이름과 콜론, 그 다음 값으로 이루어져 있다.
헤더는 맥락에 따라 다음과 같이 그룹화될 수 있다.
- general header - 요청과 응답 모두 적용되지만 전송되는 데이터와는 관련이 없는 헤더.
- request header - 패치될 리소스나 클라이언트 자체 정보를 포함한 헤더.
- response header - 응답에 대한 부가적인 정보를 갖는 헤더.
- entity header - 엔티티 바디에 대한 정보를 포함하는 헤더.
프록시 처리방법에 따라 그룹화 할 수 있다.
상태코드
수신 처리중
- 100 Continue - 요청에 문제가 없으니 다음 요청을 보내도 된다는 것을 의미. 완료했다면 무시 가능
- 101 Switching Protocol - 서버에서 프로토콜을 변경할 것을 의미
- 102 Processing - 요청을 수신하고 처리중이지만 제대로 된 응답을 알려 줄 수 없음을 의미
- 103 Early Hints - 서버가 응답을 준비하는 동안 사용자 에이전트가 사전 로딩을 시작할 수 있게함.
성공
- 200 OK - 요청이 성공적으로 완료
- 201 Created - 새로운 리소스 생성
- 202 Accepted - 요청그에 응하여 행동할 수 없음
- 203 Non-Authoritative Information - 서드 파티 복사본이 모여짐
- 204 No Content - 페이지 변환 없음
- 205 Reset Content - 문서 뷰 리셋
리다이렉션
- 300 Multiple Choice - 요청에 대해 하나 이상 응답 가능.
- 301 Moved Permanently - 영구 URL 변경
- 302 Found - 일시적 URL 변경
- 303 See Other - 요청한 리소스를 다른 URI에서 GET 해야함.
- 304 Not Modified - 응답이 수정되지 않음. (캐시 목적으로 사용.)
클라이언트 에러
- 400 Bad Request - 잘못된 응답
- 401 Unauthorized - 비인증 (클라이언트 모름)
- 403 Forbidden - 접근 권리 없음 (클라리언트 알고있음)
- 404 Not Found - 리소스 찾을 수 없음
- 405 Method Not Allowed - 메소드 사용불가
- 406 Not Acceptable - 콘텐츠 못찾음
- 407 Proxy Authentication Required - 프록시 인증 필요
- 409 Conflict - 서버 상태 충돌
- 410 Gone - 콘텐츠가 영구 삭제됨
- 411 Length Required - 정의되지 않은 요청
- 412 Precondition Failed - 적절하지 않은 전제조건
- 413 Payload Too Large - 엔티티가 서버에서 정의한 한계보다 큼
- 414 URI Too Long - URI가 너무 김
- 415 Unsupported Media Type - 지원하지 않는 미디어 포맷
- 416 Requested Range Not Satisfiable - Range 헤더 필드에 요청한 지정 범위를 만족시킬 수 없음
- 418 I'm a teapot - 커피를 찻 주전자에 끓이는 것을 거절
- 422 Unprocessable Entity - 문법 오류
- 429 Too Many Requests - 너무 많은 요청
- 431 Request Header Fields Too Large - 너무 큰 헤더 필드
- 451 Unavailable For Legal Reasons - 불법 리소스
서버 에러
- 500 Internal Server Error - 처리 방법 모름
- 501 Not Implemented - 서버에서 지원되지 않음
- 502 Bad Gateway - 잘못된 응답 수신
- 503 Service Unavailable - 요청 처리 준비 안됨
- 504 Gateway Timeout - 적시에 응답받을 수 없음
- 505 HTTP Version Not Supported - HTTP 버전이 지원되지 않음
- 508 Loop Detected - 서버 무한 루프
- 510 Not Extended - 서버 추가 확장 필요
- 511 Network Authentication Required - 클라이언트의 네트워크 인증 필요
학습에 참고한 사이트