HTTP(HyperText Transfer Protocol)는 클라이언트와 서버가 서로 통신하는 데 사용하는 프로토콜로, 주로 웹 브라우저와 웹 서버 사이에서 데이터를 주고받는 데 쓰인다.
HTTP는 단순히 웹 페이지뿐만 아니라 이미지, 영상, 파일 등 다양한 리소스를 전송하는 데 사용되며, REST API, 그래프QL, 웹 소켓 등 현대 웹 기술 대부분이 HTTP를 기반으로 동작한다.
- 비 연결성(Connectionless): 클라이언트가 요청을 보내고 서버가 응답하면 연결이 끊어진다.
덕분에 서버의 리소스를 절약할 수 있지만, 요청마다 새로 연결을 만들어야 해서 오버헤드가 생기는데, 이를 보완하기 위해 HTTP/2, HTTP/3에서는 연결을 재사용하는 방식이 도입됐다.
- stateless: 서버가 클라이언트의 상태를 기억하지 않는다.
- 동작 방식
1. 클라이언트가 HTTP 요청을 보낸다.
2. 서버가 요청을 처리하고 응답을 돌려준다.
3. 연결이 종료된다.
- 클라이언트: 요청을 보내는 쪽 (예: 웹 브라우저, 모바일 앱).
- 서버: 요청을 처리하고 응답을 보내는 쪽 (예: 웹 서버, 데이터베이스 서버).
클라이언트는 항상 요청을 시작하고, 서버는 요청에 따라 응답을 반환하는 방식으로 동작한다.
HTTP 메서드에는 안전성, 멱등성, 캐싱 가능 여부라는 중요한 속성이 있다.
- 안전성(Safe): 서버의 상태를 변경하지 않음.
- 예: GET, HEAD.
- 멱등성(Idempotent): 같은 요청을 여러 번 보내도 동일한 결과.
- 예: GET, PUT, DELETE.
- 캐싱 가능(Cacheable): 응답을 클라이언트나 중간 프록시 서버가 캐싱 가능.
- 예: GET, HEAD.
HTTP 메서드는 클라이언트가 서버에 어떤 작업을 요청의 의도를 나타내는데, 이는 RESTful API 설계에서 주요하게 활용된다. 각 메서드는 고유한 목적과 특징을 가졌으며 CRUD 작업과 밀접하게 연결된다.
GET
- 용도 : 서버에서 데이터를 조회할 때 사용.
- 특징 :
- 안전성 : 데이터를 변경하지 않는다.
- 멱등성을 지님 : 같은 요청을 여러 번 보내도 동일한 결과가 일어난다.
- 쿼리스트링 : URL에 파라미터를 붙여 데이터를 요청할 수 있다.
- 예시 :
- 블로그 글 목록 조회
GET /posts HTTP/1.1 HOST: example.com- 특정 글 조회
GET /posts/1 HTTP/1.1 HOST: example.com
POST
- 용도 : 서버에 새로운 데이터를 생성할 때 사용.
- 특징 :
- 안전하지 않음 : 데이터를 변경하거나 추가.
- 멱등성을 지니지 않음 : 같은 요청을 여러 번 보내도 계속 대체될 뿐 새로운 결과가 나타나지 않는다.
- 리소스를 교체하는 방식으로 동작.
- 예시 :
- 블로그 글 작성
POST /posts HTTP/1.1 Host: example.com Content-Type: application/json { "title": "New Post", "content": "Post content here" }
PUT
- 용도 : 서버에서 리소스를 전체 수정하거나 없으면 새로 생성.
- 특징 :
- 안전하지 않음 : 데이터를 변경하거나 추가.
- 멱등성을 지님 : 같은 요청을 여러 번 보내면 중복 생성이 가능하다.
- 요청 본문(Body)에 데이터를 포함해 전송.
- 예시 :
- 블로그 글 내용 전체 교체
PUT /posts/1 HTTP/1.1 Host: example.com Content-Type: application/json { "title": "Updated Title", "content": "Updated content" }
PATCH
- 용도 : 리소스의 일부를 수정.
- 특징 :
- 멱등성을 가질 수도, 가지지 않을 수도 있음.
- 부분 업데이트에 최적화됨.
- 예시 :
- 블로그 글 제목만 교체
PATCH /posts/1 HTTP/1.1 Host: example.com Content-Type: application/json { "title": "Partially Updated Title" }
DELETE
- 용도 : 서버에서 리소스를 삭제.
- 특징 :
- 멱등성을 가짐 : 같은 요청을 여러 번 보내도 이미 삭제돼있어서 결과가 변하지 않음.
- 리소스를 삭제한 후 상태 코드로 성공 여부를 반환.
- 예시 :
- 블로그 특정 글 삭제
DELETE /posts/1 HTTP/1.1 Host: example.com
1xx (정보)
- 요청이 처리 중임을 나타낸다.
- 실제 데이터와 관계없이 중간 상태임을 알린다. (잘 안 쓴다)
- 예:
100 Continue: 요청의 일부를 받아 서버가 나머지를 기다리고 있음.2xx (성공)
- 요청이 성공적으로 처리됐음을 알린다.
- 예:
- 200 OK: 요청 성공.
- 201 Created: 새로운 리소스 생성 성공.
3xx (리다이렉션)
- 요청한 리소스가 이동됐음을 알린다.
- 예:
301 Moved Permanently: 리소스가 영구적으로 이동.302 Found: 임시적으로 이동.4xx (클라이언트 오류)
- 클라이언트가 잘못된 요청을 보냈음을 알린다.
- 예:
400 Bad Request: 잘못된 요청 형식.401 Unauthorized: 인증 필요.404 Not Found: 요청한 리소스를 찾을 수 없음.5xx (서버 오류)
- 서버가 요청 처리 중 오류 발생했음을 알린다.
- 예:
500 Internal Server Error: 서버 내부 에러.503 Service Unavailable: 서버가 일시적으로 처리 불가능.
CRUD 작업과 HTTP 메서드를 연관시켜 설계하면 이렇게 정리할 수 있다:
동작 HTTP 메서드 예시URL 설명 조회(Read) GET /posts모든 글 목록 조회. GET /posts/1특정 글 상세조회. 생성(Create) POST /posts새 글 작성. 수정(Update) PUT /posts/1기존 글을 전체적으로 수정. PATCH /posts/1기존 글의 특정 필드만 수정. 삭제(Delete) DELETE /posts/1특정 글 삭제.