HTTP
HTTP
- HyperText Transfer Protocol
- 웹 상에서 데이터를 주고받기 위한 어플리케이션 레이어 프로토콜이다.
- 처음에는 HTML 문서를 주고받기 위해 설계되었으나, 현재는 이미지, 동영상, 파일, API 등 많은 종류의 리소스를 주고받을 때 사용한다.
HTTP의 역사
- HTTP/0.9
- 초기 버전으로 따로 버전 번호가 없었지만, 뒤의 버전들과 구분하기 위해 붙여진 이름이다.
- 버전 번호가 없었기 때문에 스타트 라인에 따로 버전 정보가 명시되지 않았다.
- GET 메서드만 지원하였다.
- HTTP 메시지에 헤더가 없었다.
- 상태 코드가 없었다. 그 때문에 문서 내에 해당 파일의 문제에 대한 설명을 같이 담기도 했다.
- HTTP/1.0
- HTTP 메시지에 버전 정보가 들어가기 시작했다.
- POST, PUT, DELETE 등 메서드가 추가되었다.
- HTTP 메시지에 헤더가 생겨났다.
- 응답 메시지에 상태 코드가 생겼다.
- HTTP/1.1
- 현재 사용하는 기능들이 대부분 자리잡은 버전이다.
- 가장 많이 사용된다.
- 뒤의 공부할 내용의 대부분이다.
- HTTP/2.0, HTTP/3.0
- HTTP/1.1에서 성능 개선 정도의 버전업.
- HTTP/3.0의 경우 다른 버전이 TCP를 사용하는 것과 달리 UDP를 사용한다.
HTTP의 특징
- 클라이언트 - 서버 프로토콜이다.
- 클라이언트의 request와 서버의 response를 교환하여 통신한다.
- 클라이언트와 서버 사이에 0개 이상의 프록시가 있다.
- HTTP는 Stateless 프로토콜이다. (상태를 유지하지 않는다.)
- 서버와 클라이언트는 이전에 보낸 request나 response를 전혀 기억하지 못한다.
- 새로운 request가 보내질 때 마다 새로운 response가 생성된다. (많은 데이터를 빠르고 확실하게 처리하는 범위성을 위한 설계)
- 상태 유지가 필요한 경우에 HTTP를 보안하기 위해 쿠키(Cookie)라는 기술을 사용한다.
- HTTP 메시지를 통해 통신을 한다.
- 리소스를 HTTP 메시지의 body에 담아 보낸다.
- 리소스를 request URI에 query string으로 보내기도 한다.
- HTTP 메서드에 따라 동작이 다르다.
- 비 연결성 통신을 한다.
- 비 연결성이란, 서버와 클라이언트가 통신이 필요할 때, 연결을 하고 한 번의 통신이 끝나면 바로 연결을 종료한다.
- 초기에는 문제가 없었으나, 점점 리소스의 크기가 커지기 시작했다. (이미지, 영상 등)
- 이미지 등의 리소스들은 여러 번의 통신을 필요로 하고, TCP 연결과 종료의 과정이 부담이 되었다.
- HTTP는 지속 연결을 통해 이를 해결한다.
- HTTP 메시지를 통해 통신을 한다.
- request와 response 둘 다 HTTP 메시지를 서로 송수신한다.
- HTTP 메시지는 request와 response의 모양이 조금씩 다르다.
HTTP 메시지
- 스타트 라인 (start line)
- 리퀘스트 라인 (request line)
- request에 사용하는 메소드와 리퀘스트 URI, 사용하는 HTTP의 버전이 포함된다.
- ex) GET /members/find?name=bogeun&age=20 HTTP/1.1
- ex) POST /members/create HTTP/2.0
- 상태 라인 (status line)
- response의 결과를 나타내는 상태 코드와 설명, 사용하는 HTTP의 버전이 포함된다.
- ex) HTTP/1.1 200 OK
- ex) HTTP/3.0 404 Not found
- 리퀘스트 라인 (request line)
- 헤더 필드 (header)
- HTTP 메시지에 부가적인 정보(조건, 속성 등)들을 담는다.
- 대소문자를 구분하지 않으며, Key : Value의 쌍으로 기입한다.
- 공백 라인 (empty line)
- 헤더와 메시지 바디를 구분하기 위한 공백 라인
- 메시지 바디 (message body)
- 전송하는 컨텐츠(Representation의 body)를 담기 위한 필드
- payload라고도 한다.
HTTP Status Code
- 클라이언트가 서버에 request를 보내고 그 request의 처리 후 결과의 상태를 알려주는게 상태 코드(status code)이다.
- 상태 코드를 통해 클라이언트가 response를 받은 후의 행동을 결정할 수 있다.
- 상태 코드는 response 메시지의 최상단에 기입되며, 세 자리의 수로 나타낸다.
- 세 자리 수에서 가장 첫 번째 숫자는 response의 클래스를 나타내며, 나머지는 따로 분류가 없다.
상태 코드 클래스
- 1XX
- Informational
- 리퀘스트를 받아들여 처리중
- 2XX
- Success
- 리퀘스트가 정상적으로 처리됨
- 3XX
- Redirection
- 리퀘스트를 완료하기 위해서 추가 동작이 필요함
- 4XX
- Client Error
- 서버에서 클라이언트의 리퀘스트를 이해하지 못함
- 5XX
- Server Error
- 서버가 리퀘스트를 처리 실패
위의 클래스들만 잘 지켜준다면, 커스텀 상태 코드를 만들어도 된다.
2xx 성공 (Success)
request가 정상적으로 처리되었음을 나타낸다.
- 200 OK
- 클라이언트의 request를 서버가 정상적으로 처리함을 나타낸다.
- 201 Created
- 요청에 성공해서 새로운 리소스가 생성되었음을 나타낸다.
- 일반적으로 POST나 PUT 요청의 응답으로 발생된다.
- 202 Accepted
- 요청을 수신했지만, 처리가 완료되지 않았음을 나타낸다.
- 처리가 될 수도 되지 않을 수도 있는 상황에 사용된다.
- batch 처리 등에 사용된다.
- 204 No Content
- 서버가 request의 처리는 성공했지만, 돌려줄 리소스가 없는 상황을 나타낸다.
- 204 상태의 response는 representation body 없이 돌려보내야 한다.
- 클라이언트에서 서버에 정보를 보내고, 클라이언트는 새로운 정보를 받을 필요가 없을 때 사용된다.
- 206 Partial Content
- Range에 의해서 범위가 지정된 request를 받았음을 나타낸다.
- response에는 Range가 지정된 범위의 representation이 포함된다.
3xx 리다이렉트 (Redirection)
- request가 정상적으로 처리되기 위해 클라이언트 측에서 특별한 처리를 수행해야 하는 경우를 알린다.
- 웹 브라우저는 3xx response에 Location 헤더가 있으면, 자동으로 그 위치로 자동 이동한다.(리다이렉트)
- 리다이렉션에는 종류가 3가지 있다.
- 영구 리다이렉션
- 일시 리다이렉션
- 특수 리다이렉션
- 영구 리다이렉션
- 기존의 uri가 사용되지 않으며, 새로운 uri로 영구적으로 이동된 경우를 나타낸다.
만약 기존의 uri가 북마크 된 경우에 리다이렉션이 발생하면, 브라우저가 새로운 uri로 북마크를 변경할 수도 있다.
- 301
- Moved Permanently
- 308
- Permanent Redirect
- 일시 리다이렉션
- 기존의 uri가 일시적으로 다른 uri를 할당받은 경우를 나타낸다.
기존의 uri가 북마크 된 경우에 리다이렉션이 발생해도 브라우저는 북마크를 변경해선 안된다.
- 302
- Found
- 303
- See Other
- 307
- Temporary Redirect
- 특수 리다이렉션
- 300 Multiple Choice
- 요청에 대해 하나 이상의 응답이 가능하다.
- 클라이언트에서 선택을 해야하는데, 그 방법이 표준화 되어있지 않다.
- 거의 사용하지 않음.
- 304 Not Modified
- 요청된 리소스의 캐시 값이 여전히 사용 가능하다고 알린다.
- 로컬에 캐시된 복사본으로 리다이렉트 한다.
- response에 body를 포함시키면 안된다. (캐시를 써야 하므로)
- 예시로,
- 클라이언트가 캐시가 오래되어 새로 보내달라 요청함
- 서버가 판단하길 사용해도 괜찮다고 304 발생
- 캐시된 곳으로 리다이렉트 된다.
- 300 Multiple Choice
4xx 클라이언트 에러 (Client error)
- 클라이언트가 원인으로 서버가 요청을 수행할 수 없음을 나타낸다.
클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에, 아무리 재시도를 해도 결과가 변할 수 없다.
- 400 Bad Request
- request 구문이 잘못되었음을 나타낸다.
- 브라우저는 이 에러를 200 OK와 같은 동작으로 처리한다.
- 예시로, HTTP API 스펙에 맞지 않는 요청일 때, 요청 파라미터가 잘못된 경우 등
- 401 Unauthorized
- request에 HTTP 인증 정보가 필요하다는 것을 나타낸다.
- 401 response를 보낼 때는 인증 방법에 대한 설명과 WWW-Authenticate 헤더 필드를 담아 보내야 한다.
- 403 Forbidden
- 요청된 리소스에 대해 엑세스가 거부된 경우이다.
- 인증 자격은 있지만, 접근 권한이 없어 거부된 경우이다.
- response의 메시지 바디에 거부의 이유를 기재한다.
- 예시로, 일반 회원이 어드민 자격을 필요로 하는 리소스에 접근하는 경우.
- 404 Not Found
- 요청된 리소스가 서버 상에 없다는 것을 나타낸다.
- 그 외에도 거부의 이유를 기재하고 싶지 않은 경우에 사용된다.
5xx 서버 에러 (Server error)
- 서버가 원인으로 요청을 제대로 처리할 수 없는 경우를 나타낸다.
서버의 문제이므로 같은 요청을 다시 보냈을 때, 결과가 바뀔 수도 있다.
- 500 Internal Server Error
- 서버에서 request를 처리하는 도중 에러가 발생함을 나타낸다.
- 백엔드에서 애매한 경우에 그냥 500을 날린다.
- 503 Service Unavailable
- 서버가 과부하 상태이거나 점검중이라 일시적으로 요청을 처리할 수 없음을 나타낸다.
- Retry-After 헤더 필드로 얼마뒤에 복귀되는 지 클라이언트에 알릴 수 있다.
This post is licensed under CC BY 4.0 by the author.