3. HTTP의 구조 및 핵심 요소
원래 책에서는 4장에 해당되며, API 만들기 전에 HTTP에 대한 설명이 먼저 하는게 맞을듯 하여 임의로 순서를 변경하였습니다.
1) HTTP
- HyperText Transfer Protocol의 약자로 HTML을 주고 받을 수 있도록 만들어진 프로토콜
- 통신방식
- Request & Response (Stateful)
- 클라이언트에서 서버로 HTTP Request를 보내면 서버에서 처리 후 결과에 따른 HTTP 응답을 Response 하는 방식
- 대표적으로 TCP 통신이 해당되고, FTP, Telnet 과 같은 유저 정보를 계속 가지고 있는 경우의 프로토콜들입니다.
- Stateless
- 기본적인 HTTP가 해당됩니다. 또한, UDP와 DNS가 해당됩니다.
- state를 가지지 않고 통신한다는 의미.
- 각각의 HTTP 통신은 독립적이며, 그 전에 처리된 HTTP 통신에 대해서 전혀 알지 못합니다.
- 다만 stateless이기에 HTTP 요청을 보낼때는 해당 요청을 처리하기 위해 필요한 모든 데이터를 매번 포함 시켜서 요청해야함.
- 그래서 필요한 것은 Cookie나 Session등을 사용하여 HTTP 요청을 처리할때 필요한 진행 과정이나 데이터를 저장합니다.
- Cookie는 클라이언트 쪽에 저장하는 값
- Session은 서버에 저장하는 값
2) HTTPS
- HyperText Transfer Protocol over Secure Socket Layer의 약자이며 기존의 HTTP의 보안이 강화된 버전입니다. SSL이나 TLS를 사용합니다.
- Chrome에서는 HTTPS를 안쓰면 보안상 문제있는 사이트라고 경고를 합니다.
3) HTTP 요청(Request) 구조
![](https://velog.velcdn.com/images%2Fjmkim87%2Fpost%2F251db7eb-a8b4-499d-b382-856dbbc77613%2FUntitled.png)
- Start Line
- GET / HTTP1.1
- GET method이며 / 경로를 HTTP1.1 버전의 protocol로 사용한다는 의미
- Headers
- HOST부터 Cookie 까지가 Header입니다.
- Host : 요청이 전송되는 target의 호스트 URL 주소
- User-Agent` : 요청을 보내는 클라이언트의 정보 (브라우저에 대한 정보)
- Accept : 해당 응답이 받을 수 있는 타입을 알려 주는 헤더
- MIME(Multipurpose Internet Mail Extension)
- Connect : 해당 요청이 끝난 후에 클라이언트와 서버가 계속해서 네트워크 연결을 유지할 것인지 끊을 것인지에 대한 헤더
- Content-Type : 해당 요청의 body 타입을 알려주는 헤더
- Content-Length : HTTP 요청이 보내는 메시지 bodt의 총 사이즈를 알려주는 헤더
- Body
- GET에는 Body가 없으나 POST와 같이 데이터를 넘길수 있는 Method 같은 경우 Cookie 아래쪽에 Body가 보입니다.
4) HTTP 응답(Response) 구조
![](https://velog.velcdn.com/images%2Fjmkim87%2Fpost%2F3594d660-ff0f-423c-b157-c52ef93c2a11%2FUntitled%201.png)
5) HTTP 메소드
- GET : 특정한 리소스를 가져오도록 요청합니다. 데이터를 가져올때만 사용해야 합니다.
- POST : 서버로 데이터를 전송할때 쓰입니다. 보통 Form에 있는 데이터를 전송할 때 쓰입니다.
- OPTIONS : 특정 엔드포인트에서 허용하는 메소드들이 무엇이 있는지 알고자 할 때 사용합니다.
- PUT : 요청 페이로드를 사용해서 새로운 리소스를 생성하거나 대상 리소스를 나타내는 데이터를 대체합니다. POST와 비슷하나 멱등성이라는 차이가 있습니다.
- 멱등성(idempotent) : 요청을 여러번 하여도 항상 같은 결과여야 합니다.
- PATCH : PUT과 다르게 리소스의 부분적인 수정을 할 때에 사용됩니다.
- DELETE : 리소스를 삭제할 때 사용됩니다.
6) API 엔드포인트 아키텍처 패턴
- REST(Representational State transfer) API : 자원을 URI로 표시하고 해당 자원의 상태를 주고 받는 것의 의미
- Uniform Interface : HTTP 표준만 따른다면 어떤 언어 혹은 어떤 플랫폼에서 사용이 가능한 스타일입니다.
- Stateless : Rest는 상태 정보를 유지하지 않습니다..
- Cacheable : HTTP가 가진 캐싱 기능 적용이 가능합니다.
- Self-descriptiveness : Rest API 메시지만 보고도 쉽게 이해할 수 있는 자체 표현 구조로 되어 있습니다.
- Client-Server : 서로간의 의존성이 줄어들기 때문에 역할 구분이 확실해집니다.
- Layerd System : 클라이언트는 API 서버만 호출하며 서버는 로드 밸런싱, 암호화, 사용자 인증등을 추가하여 유연적으로 구조를 가질수 있습니다.
- 조건
- /로 계층 관계를 나타냅니다.
- 마지막에 /를 사용하면 안됩니다.
- 하이픈은 URI의 가독성을 높일수 있습니다.
- 언더바 혹은 밑줄은 URI에 사용하지 않습니다.
- 경로는 소문자로 작성합니다.
- 파일 확장자는 URI에 포함하지 않습니다.
- 유저 관련 자원에 대한 예시
- GET /users/321 321 ID를 가진 유저 정보를 가져옴
- DELETE /users/321 321 ID를 가진 유저를 삭제
- POST /users 유저를 생성 (body에 정보가 있음)
- RESTful API
- REST API가 보기 불편한 것을 좀 더 보기 좋게 만드는 형식
- 다만 정확한 정의는 없고 개발자들이 보기 편한 방식으로 하시면 됩니다.
- 유저 관련 자원에 대한 예시
- GET /users : 모든 유저를 가져옴
- GET /user/321 : 321 ID를 가진 유저를 가져옴
- PUT /user/321 : 321 ID를 가진 유저를 수정
- DELETE /user/321 : 321 ID를 가진 유저를 삭제
- GraphQL