
HTTP 프로토콜 정의?
웹 개발을 하는 도중에 서버와 클라이언트간의 데이터를 전송하고 전송받는 통신에 대해서 지금까지 그냥 당연하게 주고 받는다고 생각했는데 이해를 하고 넘어가야 되겠다고 생각해서 정리를 하게 되었다.
Hypertext, Protocal
Hypertext
- 하이퍼 텍스트는 링크를 통해 연결된 텍스트의 형태로, 사용자가 텍스트를 클릭하거나 터지함으로써 다른 문서로 즉이 이동할 수 있는 방식의 정보 표현 방법을 의미한다.
예를 들어서 HTML(Hypertext Markup Language)은 우리가 웹 개발을 할때 쉽게 접할수 있는 문서인데 여기에서 사용하는 링크(<a 태그>)를 통해서 다른 웹사이트로 이동할수 있는 것처럼 문서들이 서로 상호 연결할수 있는 정보 표현 방법 이라고 생각할수 있다.
Protocal
- 컴퓨터 네트워크나 통신 시스템에서 정보를 주고받는 데 사용되는 규칙의 제계를 의미한다. 프로토콜의 종류에는 HTTP, TCP/IP, SMTP, FTP 등이 있다.
HTTP 규칙
1. 클라이언트 - 서버 모델
- 소프트웨어 시스템이나 애플리케이션을 설계하고 구현하는 데 사용되는 아키텍처적인 패턴으로 이 모델은 시스템을 두 개의 주요 구성 요소로 나누는데, 하나는 클라이언트(또는 프론트엔드), 다른 하나는 서버(또는 백엔드)로 구성된다.
2. 무상태(Stateless) 프로토콜
- 무상태(Stateless)
- 요청이 독립적이기 때문에 서버가 클라이언트의 이전 상태를 알수 없다. 이로인해 세션 정보, 상태 정보 등을 추가적으로 관리를 해야한다.
Ex) 사용자가 브라우저에서 웹 페이지를 요청하는 경우, 클라이언트는 각각의 요청에 대한 정보를 서버에게 보낸다. 서버는 이 요청을 독립적으로 처리하고 응답을 생성한 후에 연결을 끊는다. 서버는 클라이언트의 상태를 알지 못하며, 각 요청은 서로에게 영향을 주지 않는다.
- 상태(Stateful)
- 연결이 유지되므로 클라이언트의 상태를 서버가 계속해서 추적할수 있다.
Ex) 클라이언트가 서버에게 파일을 전송하는 경우 TCP 연결이 확립되는데, 이 연결은 상태를 유지하며, 서버와 클라이언트 계속해서 상호작용을 합니다. 클라이언트가 파일을 전송하면, 서버는 현재까지 전송된 데이터를 추적하고 정보를 유지한다.
* HTTP 프로토콜이 무상태일 경우 이점이 <확장성>이다.
1. 수평 확장성
- 웹 어플리케이션에서 사용자 수가 급증하여 기존의 서버가 처리하기가 어려워 질경우, 새로운 서버 인스턴스를 추가해서 트래픽을 분산 처리해줘야 한다. 이때 상태가 (Stateful) 일 경우 클라이언트 서버가 현재 연결되어있는 서버와 계속 연결이 되므로 새로운 서버가 추가 되더라도 다른 서버에 요청을 보낼수가 없다. 이때 (Stateless) 상태라면 서로 다른 서버에 보내는 요청이 공유 되지 않고 독립적이기 때문에 서버를 쉽게 확장(스케일 아웃)할수 있다..
2. 캐싱 활용
- 사용자 A가 특정 리소스를 요청하고, 이 응답이 캐시에 저장된다고 가정할때, 이후 사용자 A가 동일한 리소스를 요청하면, 서버는 이전에 저장된 캐시된 응답을 사용하여 서버 부하를 줄일 수 있다.
Ex) 예시로 로그인을 할때 클라이언트가 로그인 요청을 서버에 보내고, 서버에서는 로그인을 성공하면 세션 토큰을 발급해서 클라이언트에게 넘겨주고 클라이언트는 헤더나 쿠키에 이 토큰을 심어준다. 후에 해당 토큰을 담아서 서버에 요청을 보내면 서버에서는 해당 토큰의 유효성 검사후에 유효하면 다시 응답을 보내는 로직이다.
3. 메서드(Methods)
HTTP는 다양한 메서드를 정의하여 서버에게 어떤 동작을 수행할지 알려준다.
멱등(Idempotent): 동일한 요청을 여러 번 반복해도 동일한 결과를 반환해야 한다.
-
GET (조회)
- 클라이언트가 서버에게 리소스를 요청할때 사용
- URL 파라미터로 데이터를 전달한다.
- 멱등(O)
- 안전성(O)
- GET /api/users?name=John&age=25
-
POST (전송)
- 클라이언트가 서버에게 새로운 엔터티를 제출할때 사용.
- 안전성(X)
- 멱등(X)
- 요청 본문(Body)에 데이터를 담아서 전달.
-
PUT (갱신 또는 생성)
- 클라이언트가 서버에게 리소스를 생성하거나 업데이트할 때 사용
- 안전성(X)
- 멱등(O)
- 요청 본문(Body)에 데이터를 담아서 전달.
-
DELETE (삭제)
- 클라이언트가 서버에게 리소스를 삭제 할 때 사용.
- 주로 URL 파라미터로 리소스를 식별하여 삭제 처리함
- 안정성(X)
- 멱등(O)
- DELETE /api/users/123
-
PATCH (일부 개인)
- 클라이언트가 서버에게 리소스의 일부를 갱신하라는 요청.
- 안전성(X)
- 멱등(X)
- 요청 본문(Body)에 부분적인 업데이트를 수행하기 위한 데이터를 담아서 전달.
4. HTTP 상태 코드
-
1xx (Informational
- 100 Continue: 클라이언트가 계속해서 요청을 진행할수 있는 경우.
-
2xx (Successful)
- 200 OK: 요청이 성공적으로 처리되었음을 나타냄
- 201 Created: 새로운 리소스가 성공적으로 생성되었음을 나타냄
- 204 No Content: 요청이 성공했지만 응답으로 컨텐츠가 없음을 나타냄
-
3xx (Redirection)
- 301 Moved Permanently: 리소스가 새로운 위치로 영구적으로 이동됨.
- 302 Found: 리소스가 일시적으로 다른 위치로 이동되었음.
-
4xx (client Error)
- 400 Bad Request: 잘못된 요청이 서버에 전달됨.
- 401 Unauthorized: 인증이 필요한 리소스에 접근할 때 인증이 실패함.
- 402 Forbidden: 클라이언트가 리소스에 접근할 권한이 없음.
- 404 Not Found: 요청한 리소스를 서버에서 찾을수가 없음.
-
5xx (Server Error)
- 500 Internal Server Error: 서버가 요청을 처리하는 동안 오류가 발생했음.
- 503 Service Unavailable: 서버가 현재 요청을 처리할 수 없음을 나타냄.