HTTP(HyperText Transfer Protocl)란 웹 상에서 정보를 주고받을 수 있는 프로토콜이다.
HTML 파일과 같은 하이퍼 미디어 문서를 전송하기 위해 고안되었다.
OSI 7계층 중 어플리케이션 레이어에 해당한다.
하나의 웹 페이지는 HTML(HyperText Markup Language), 이미지, 오디오 파일 등의 자원(Resource)을 참조하는 하나의 HTML 파일로 이루어진다.
이러한 자원들은 서로 다른 웹 서버들에 저장될 수 있다.
웹 페이지를 구성하는 HTML 파일은 URL(Uniform Resource Locator)을 통해 자원을 참조한다.

host는 자원이 저장된 서버를, path는 해당 리소스가 위치한 경로를 나타낸다.
HTTP 통신 주체는 HTTP 요청(request)을 보내는 브라우저인 클라이언트와 요청받은 자원을 응답(response)하는 웹 서버로 구성된다.

HTTP 통신은 주로 TCP 연결을 통해 이루어진다. (HTTP 3는 UDP를 사용)

서버는 클라이언트에 대한 상태를 유지하지 않는다. (stateless)
장점
단점
HTTP 메시지는 크게 헤더와 바디로 구분된다.
헤더는 키-값 쌍의 형태로 이루어져 있으며 요청이나 응답에 대한 부가적인 정보를 나타낸다.
바디는 요청이나 응답에 포함될 데이터를 나타낸다. 바디는 없을 수도 있다.
HTTP 요청 메시지 형식은 아래와 같다.

요청 시작 라인에 메소드와 자원의 경로인 URL. HTTP 버전을 입력한다.
이후 한 줄에 하나씩 헤더를 입력한다.
만약 바디가 존재한다면 한줄을 띄우고(CRLF) 바디를 입력한다.

위 HTTP 메시지의 첫줄과 Host 헤더를 보면 HTTP1.1을 사용하여 www-net-cs.umass.edu(도메인네임)에게 /index.html에 위치한 자원 조회(GET)를 요청한다는 것을 알 수 있다.
첫 번째 라인을 제외하면 요청 메시지와 동일한 구성이다.
시작 라인은 HTTP 버전과 상태코드로 이루어진다.
서버는 상태 코드를 통해 요청의 결과를 나타낸다.
HTTP 상태 코드는 세 자리 숫자로 이루어지며 5개의 그룹으로 나뉜다.
1xx (Informational): 요청이 수신되었고 처리가 진행 중
2xx (Success): 요청이 성공적으로 처리되었음
3xx (Redirection): 요청을 완료하기 위해 클라이언트의 추가 동작이 필요
4xx (Client Error): 클라이언트 요청에 오류가 있어 요청을 처리하지 못함
5xx (Server Error): 서버 오류로 요청을 처리하지 못함
자주 사용되는 상태 코드에 대해 알아보자
200 OK
201 Created
202 Accepted
204 No Content
301 Moved Permanently
308 Permanent Redirect
302 Found
303 See Other
307 Temporary Redirect
302의 원래 의도는 HTTP 메서드를 유지하는 것이었으나 대부분의 브라우저에서 GET메서드로 변경시킨다.
따라서 모호한 302보다 의도가 명확한 303이나 307을 사용하는 것을 권장한다.
POST후에 브라우저를 새로고침하면 POST가 다시 전송될 수 있다.
POST후에 리다이렉트를 통해 메서드를 GET으로 바꿔주면 새로고침을 하더라도 GET이 호출되어 POST의 중복 호출을 방지할 수 있다.
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed
409 Conflict
429 Too Many Requests
HTTP 메서드는 각 요청이 어떻게 처리되어야 하는지를 서버에게 알려준다.
reqeust
GET /search?keyword=hi&page=1 HTTP/1.1
...
respons
HTTP/1.1 200 OK
Content-Type: text/html
...
data data ...
지정된 자원을 요청한다.
서버에 데이터를 전달하고 싶은 경우 쿼리스트링을 사용한다.
Body를 사용할 수 없는 것은 아니나 권장하지 않는다. 쿼리 스트링이나 경로변수을 사용하자.
path variable : 리소스 식별이 중요하고, 계층 구조를 나타내는 경우 적합
qurey parameter : 추가적인 필터링이나 정렬 기능을 제공할 때 유용
request
POST /posts HTTP/1.1
Content-Type: application/json
...
{
"title": "글 제목",
"content": "글 내용"
}
response
HTTP/1.1 201 created
Content-Type: application/json
...
{
"id": 1
"title": "글 제목",
"content": "글 내용"
}
Body를 통해 요청 데이터를 전달한다.
서버는 요청 데이터를 처리한다.
POST는 새 리소스 생성 뿐만 아니라 데이터 변경, 프로세스 처리 시에도 사용할 수 있다. (애매하면 POST)
PUT /posts/1 HTTP/1.1
Content-Type: application/json
...
{
"title" : "글 제목"
"content": "글 내용 수정"
}
response
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1
"title": "글 제목",
"content": "글 내용 수정"
}
리소스를 수정 혹은 생성하기 위해 사용한다.
클라이언트가 리소스를 식별하여 새로운 상태와 함께 서버로 전송한다.
서버는 해당 리소스가 존재하면 대체한다. (본문을 완전히 덮어쓴다는 것에 주의하자; 전체 선택 후 붙여넣기오와 같다)
만약 리소스가 없다면 새로 생성한다.
request
PATCH /posts/1 HTTP/1.1
Content-Type: application/json
...
{
"content": "글 내용 수정"
}
response
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1
"title": "글 제목",
"content": "글 내용 수정"
}
리소스의 일부를 수정하기 위해 사용한다.
PUT과 달리 리소스를 부분적으로 변경한다. (body에 포함시킨 부분만 변경)
request
DELETE /posts/1 HTTP/1.1
...
response
HTTP/1.1 204 No Content
...
리소스를 제거하기 위해 사용한다.
멱등(Idempotent) : 여러 번 호출해도 그 결과가 바뀌지 않는다.
클라이언트가 같은 요청을 해도 되는가를 판단하는 근거가 된다.
GET 메서드와 유사하지만, 응답 헤더까지만 반환한다.
일반적으로 리소스가 변경되었는지 확인하고자 할 때 사용한다.
대상 리소스에 대한 통신 가능 옵션(메서드) 목록을 반환한다.
서버에서 어떤 메서드가 허용되는지 확인할 수 있다.
CORS(Cross-Origin Resource Sharing)를 확인하는 데도 사용한다.
대상 리소스로 식별되는 서버에 대한 터널을 설정한다.
클라이언트가 프록시 서버를 통해 다른 호스트와 직접적인 TCP 연결을 설정할 수 있게 한다.
대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행한다.
주로 디버깅 목적으로 사용되며, 요청이 서버에 어떻게 도달하는지 확인한다.
James Kurose, Keith Ross, 『Computer Networking: A Top-Down Approach 7th Edition』
김영한, 『모든 개발자를 위한 HTTP 웹 기본 지식』, 인프런
인파, 『3XX (Redirection) 상태 코드 - 총정리 모음』