목차
HTTP(HyperText Transfer Protocol)는 클라이언트와 서버간에 데이터를 주고받기 위해 만든 통신 규약이다.
여기서 HyperText는 문서간 연결(하이퍼링크) 기능을 가진 텍스트를 의미하며, Transfer Protocol은 텍스트로 작성된 정보를 전달하기 위한 규약을 의미한다.
서버는 클라이언트의 이전 상태를 기억하지 않는다.
서버는 클라이언트의 요청을 독립적으로 처리하게 된다.
만약 서버가 모든 클라이언트의 상태를 기억하게 되면 서버 부담이 커지고 크게는 과부하가 발생할 수 있다. 그래서 HTTP는 각 요청에 필요한 정보를 요청마다 함께 전달하도록 설계되었다.
쿠키, 세션, 토큰등이 예시라고 할 수 있다.
클라이언트가 요청을 보내고 서버가 응답을 마치면, 연결을 끊는다.
서버가 모든 클라이언트의 연결을 끊지않고 유지한다면, 마찬가지로 서버 부담이 커지게 되고 과부하가 발생할 수 있다. 그래서 서버는 필요한 순간에만 연결함으로서 더 많은 요청을 효율적으로 관리할 수 있게 한다.
보통은, 정해진 시간 동안 연결을 유지하여 연속으로 요청/응답을 실시할 수 있다. 이를 Keep-Alive기능이라고 한다.
HTTP는 크게 1.시작줄(요청줄) 2.헤더(Header) 3.본문(Body)으로 구성된다.
// (1) 시작 줄 (Start-Line)
Version: HTTP/1.1
Method: POST
URL: 홈페이지 주소:포트번호/아이템
// (2) 헤더 (Headers)
Content-Type: application/json
Accept: application/json, text/html
...
// (3) 본문 (Body)
{
"name": "아이스크림",
"price": 2000,
"category": "dessert"
}
HTTP요청은 클라이언트가 서버에 필요한 동작을 요청하거나 데이터를 전달하는 것이다.
여기에는 GET(데이터 조회), POST(데이터 전달 및 생성), DELETE(삭제)등이 있다.
예를 들어, Post메서드는 서버에 데이터를 전달하거나 또는 새로운 데이터를 생성할 때 주로 사용한다. URL을 첨부하여 어떤 자원에 요청을 보낼지 결정하고 Body(아이스크림,2000원,간식)에 필요한 데이터를 담아 전달한다
// (1) 상태 줄 (Status Line)
Version: HTTP/1.1
Status Code: 201
Status Text: Created
// (2) 헤더 (Headers)
Content-Type: application/json
// (3) 본문 (Body)
{
"id": "abc-123-xyz",
"name": "새우깡",
"price": 1500,
"category": "living"
}
응답은 클라이언트의 요청(Request)에 대해 서버가 결과를 반환하는 메시지이다.
여기서 Status Code는 서버가 요청을 어떻게 처리했는지를 알 수 있게 해주는 코드이다.
| 상태 코드 | 상태 메시지 | 설명 |
|---|---|---|
| 100 | Continue | 요청의 일부를 받았으며 계속 진행 가능 |
| 101 | Switching Protocols | 프로토콜 변경 요청 승인 |
| 200 | OK | 요청 성공 |
| 201 | Created | 새로운 데이터 생성 성공 |
| 202 | Accepted | 요청 접수 완료 (처리 중) |
| 204 | No Content | 요청 성공, 반환할 데이터 없음 |
| 301 | Moved Permanently | 요청한 자원이 영구적으로 이동됨 |
| 302 | Found | 요청한 자원이 임시로 이동됨 |
| 304 | Not Modified | 변경된 내용 없음 (캐시 사용) |
| 400 | Bad Request | 잘못된 요청 |
| 401 | Unauthorized | 인증 필요 |
| 403 | Forbidden | 접근 권한 없음 |
| 404 | Not Found | 요청한 자원을 찾을 수 없음 |
| 405 | Method Not Allowed | 지원하지 않는 요청 방식 |
| 409 | Conflict | 요청이 현재 상태와 충돌 |
| 500 | Internal Server Error | 서버 내부 오류 |
| 502 | Bad Gateway | 게이트웨이 서버 오류 |
| 503 | Service Unavailable | 서버 이용 불가 |
| 504 | Gateway Timeout | 서버 응답 시간 초과 |
Status Code에서 자주 볼 수 있는 상태 코드에는 이 정도가 있다.
요청의 경우에는 크게 두가지 방법으로 데이터를 전송할 수 있다.
이는 조회와 같이 조건만 간단히 보낼때 사용된다.
예를들어,
GET 홈페이지 주소 : 포트번호/search?keyword=아이스크림
라는 코드를 사용했다면, '홈페이지주소의 포트번호로 가서 상품을 찾아야하는데, 키워드는 아이스크림이다.' 라는 뜻이다.
주로 데이터 추가, 수정과 같이 많은 데이터를 전달해야 할때나, 비밀번호같은 민감한 데이터를 다룰때 사용된다.
URL에는 길이 제한이 존재하고 많은 데이터를 전달하기에 적절하지 않기 때문에 Body를 사용한다.
또한, URL은 브라우저 주소창에 노출될 수 있으므로 민감한 데이터는 Body에 넣어서 전달한다.