RESTful Web API 책을 보며 정리했던 내용들을 포스팅하겠습니다.
HTTP란?
Hypertext Transfer Protocol 줄여서 HTTP라고 부릅니다. HTTP는 Web에서 클라이언트와 서버 간의 데이터 전송을 위해 사용되는 Application Layer Protocol입니다. Request와 Response 쌍으로 구성. 데이터를 평문으로 전송하는 프로토콜이며 Stateless한 프로토콜이기도 합니다. 응답 이후에 다른 상태를 저장하지 않기 때문에 Stateless하다는 표현을 합니다.
아까 언급했듯이 데이터가 평문으로 전송되는 형태이므로 보안 취약점들이 존재하므로 HTTPS 같은 방법을 권장합니다.
HTTP 연결 과정
https://okky.kr/article/787738
HTTP는 TCP나 UDP 방식으로 통신을 합니다. HTTP랑 TCP/UDP랑은 다른 계층인데 이게 무슨 말인지 싶은 분들은 위의 글을 읽어보시길 추천드립니다. 한 줄 요약하면 하나의 요청-응답 트랜잭션이 TCP 기반으로 동작한다는 얘기입니다.
어쨋든 주로 사용한다는 TCP의 연결 방식을 알아보면 되겠군요.
연결을 시작할 때는 3-way handshake를 연결을 끊을 때는 4-way handshake를 사용합니다.
3-way handshake
handshake 과정은 간단합니다. 클라이언트 측에서 요청을 하기 위해서 SYN 패킷을 보냅니다. 서버 측에서는 SYN을 잘 받았고 요청을 수락한다는 의미의 SYN/ACK 패킷을 보냅니다. 그리고 클라이언트가 ACK를 보내고 나면 둘이 통신 합의가 된 것이고 다음부터는 데이터 전송이 가능해집니다.
4-way handshake
클라이언트가 접속 종료 함수인 CLOSE()를 호출하면서 FIN을 보냅니다. 서버측에서는 FIN을 보고 연결 종료를 하려는 것을 알아채겠죠. 잘 받았다는 뜻으로 ACK를 보내고 서버 측도 CLOSE 호출 및 FIN 전송을 합니다. 마지막으로 클라이언트 측에서도 ACK를 하면서 연결이 종료가 됩니다.
참고 : https://jee-goo.tistory.com/entry/Web-HTTP%EB%9E%80
예시를 통해서 HTTP 통신 과정을 전체적으로 살펴보겠습니다. 사용자가 웹 브라우저를 통해 서버에 이미지를 요청하고 그것을 사용자에게 보여주지까지의 과정을 설명해봅시다.
1. 사용자가 특정 주소로 접근해 이미지를 요청한다고 합니다.
2. 웹 브라우저가 URL을 이용해 서버의 ip를 추출합니다.
3. 이미지 요청을 하기 위한 HTTP 메시지를 만듭니다. 이 예시에서는 단순히 이미지를 요청하는 메시지니까 GET이 되겠습니다.
4. 웹 브라우저가 서버와 3-way handshake를 통해 연결을 생성합니다.
5. 웹 브라우저가 서버에 HTTP 요청을 보냅니다. 서버측은 GET 요청을 받게 되고 요청받은 리소스가 있는지 찾습니다.
6. 있는 경우에는 상태코드 200가 함께 원하는 리소스를 전달해줍니다.
7. 4-way handshake로 연결을 종료합니다.
HTTP Method
멱등성이란 1번 요청하거나 n번 요청하거나 결과에 차이가 없는
것을 의미합니다.
GET (멱등성 O)
리소스를 조회하는 상황에서 사용하는 HTTP Method 입니다. 이 요청에 대해서는 캐싱이 가능하고 요청 Body가 존재하지 않습니다. 이 요청을 통해 받을 수 있는 State code는 200, 400, 404 등이 있습니다.
POST (멱등성 X)
리소스를 생성하는 상황에서 사용하는 HTTP Method 입니다. 이 요청에 대해서는 캐싱이 가능하고 요청 Body가 존재합니다. 요청 시마다 새로운 리소스가 생성되기에 멱등성을 지키지 못한다고 이야기합니다. 받을 수 있는 State code는 201, 204 등이 있습니다.
DELETE (멱등성 O, X)
이 요청은 구현 방식에 따라 멱등성을 지킬 수도 있고, 지키지 못할 수도 있습니다. 기본적인 제약으로는 멱등성을 지킨다고 하는데, 이를 만족시키기 위해서는 해당 요청에 따라 리소스가 바로 삭제되는 것이 아닌 Flag 등을 통한 Soft Delete가 되어야 합니다. 리소스를 삭제하는 상황에서 사용하는 HTTP Method입니다. 이 요청에 대해서는 캐싱이 불가능하고 요청 Body가 존재하지 않습니다.
PUT (멱등성 O)
리소스를 전체적으로 수정할 때 사용하는 HTTP Method 입니다. 이 요청에 대해서는 캐싱이 불가능하고 요청 Body가 존재합니다. 이 요청은 리소스가 존재한다면 모든 정보를 수정하고, 존재하지 않는다면 새로운 리소스를 생성하게 됩니다. 즉 POST와 같이 리소스 생성 시 필요한 모든 정보를 포함하고 있어야 합니다.
HTTP Status
HTTP Protocol은 Status Code(상태 코드)를 정의, 제공하기에 요청 Client에게 상태를 알려줄 수 있습니다.
1xx번대
- 100 Continue
- 임시 응답, Client 가 요청하거나 요청이 완료된 경우에는 무시해도 되는 코드이다.
- 101 Switching Protocol
- 서버에서 통신 Protocol을 변경할 것임을 알려주는 것이다.
- 102 Processing
- 서버가 요청에 대해서 처리 중이지만, 아직 응답할 수 없음을 알려주는 것이다.
2xx번대
- 200 OK
- 메서드에 따라 의미가 변경되는 code로써 일반적으로 요청이 성공적으로 진행되었다는 의미입니다.
- 201 Created
- 요청이 성공적이었고, 그에 따른 새로운 Resource가 생성되었다는 의미입니다.
- 204 No Content
- 요청은 성공적이었으나, 서버에서 제공할 Content는 존재하지 않는다는 의미입니다.
3xx번대
- 300 Multiple Choice
- 요청에 대해 하나 이상의 응답이 가능함을 의미하고, Client는 응답 방식을 선택하여야 합니다.
- 301 Moved Permanently
- 요청한 Resource의 URI가 변경되었음을 의미합니다.
- 303 See Other
- 요청한 Resource에 대해 다른 URI로 GET 요청을 보내야 함을 알려주는 것입니다.
4xx번대
- 400 Bad Request
- 잘못된 요청 정보에 의하여 서버가 해당 요청을 처리할 수 없음을 의미합니다.
- 401 Unauthorized
- 해당 요청이 인증되지 않았음을 의미합니다. 이 Resource에 접근하기 위해서는 인증이 필요합니다.
- 403 Forbidden
- 해당 요청이 인가되지 않았음을 의미합니다. 이 Resource에 접근하기 위한 권한이 부족합니다.
- 404 Not Found
- 해당 요청에 대해서 해당하는 Resource를 찾지 못했음을 의미합니다.
- 405 Method Not Allowed
- 해당 요청에 따른 메서드가 존재하나, 현재 사용할 수 없음을 알려줍니다. 제거된 경우도 포함합니다.
5xx번대
- 500 Internal Server Error
- 서버가 현재 요청을 처리하지 못하는 상황이거나, 처리할 수 없는 요청임을 의미합니다.
- 502 Bad Gateway
- 서버가 요청을 처리하는데 필요한 응답이 잘못 수신되었음을 의미합니다.
- 503 Service Unavailable
- 서버가 요청을 처리할 준비가 되지 않은 상태임을 의미합니다.
주요 참고 | RESTful Web API
'TechTalk' 카테고리의 다른 글
[Database] 데이터베이스 인덱스(Index)란? (0) | 2021.06.10 |
---|---|
웹 메일도 SMTP/POP를 쓸까? (0) | 2021.06.01 |
Kafka vs RabbitMQ (3) | 2021.05.25 |
[책 리뷰] RESTful Web API (1) | 2021.05.24 |
CSRF 공격이란? (0) | 2021.05.19 |