HTTP란
REST의 중요한 특징인 Uniform 인터페이스, 스테이트리스, 서버, 캐시 등을 구현하고 있는 Web의 기반이 되는 프로토콜
HTTP는 TCP/IP를 기본으로 하는 프로토콜입니다. 그 말은 TCP/IP의 4계층(네트워크 계층, 인터넷 계층, 트랜스포트 계층, 애플리케이션 계층) 중 인터넷 계층에서 IP를, 트랜스포트 계층에서는 TCP를 사용하고 있다는 것을 말합니다.
handshake
TCP 3 handshake(연결시)
- 연결할래(SYN)
- 응, 연결해!(ACK, SYN)
- 응, 한다(ACK)
SYN은 '연결요청'을 말합니다. 결국 둘다 ACK를 받아야 Connection이 이루어지는 것입니다.
TCP 4 handshake(종료시)
- 종료할래(FIN)
- 응, 알겠어(ACK). 나도 종료할래(FIN)
- 응, 알겠어(ACK)
FIN은 '종료요청'을 말합니다. 이것도 연결과 마찬가지로 둘다 ACK를 받아야 종료가 되는 것이군요.
HTTP 메시지
요청시
- '요청라인 - 헤더 - 바디' 로 구성됩니다.
- 요청라인은 메서드, 요청 URI, 프로토콜 버전으로 구성됩니다.
- 바디는 있을 수도 있고 없을 수도 있는데요. 리소스를 새로 작성하거나 갱신할 때 들어갈 수 있습니다.
응답시
- '스테이터스 라인 - 헤더 - 바디'로 구성됩니다.
- 스테이터스 라인은 프로토콜 버전, 스테이터스 코드, 텍스트 구문(예. OK)으로 구성됩니다.
정리하면 헤더, 바디로 구성된다는 점은 요청, 응답에서 같지만 헤더 앞에 나오는 부분에서 차이가 있네요.
HTTP의 스테이트리스성
이 부분은 참 헷갈리는 부분이었는데요. 책에서 나오는 예시를 보면서 좀 감을 잡을 수 있었습니다. 예를들어 햄버거 집에서 주문을 한다고 생각해볼게요.
스테이트풀 할 때
- 종업원 : 안녕하세요, 햄버거로 뭘 주문하시겠어요?
- 손님 : 불고기 버거할게요.
- 종업원 : 사이드 메뉴로는 뭘 하실건가요?
- 손님 : 감자튀김이요.
- 종업원 : 음료로는 뭘 주문하시겠어요?
- 손님 : 콜라요
스테이트리스 할 때
- 종업원 : 안녕하세요, 햄버거로 뭘 주문하시겠어요?
- 손님 : 불고기 버거할게요.
- 종업원 : 사이드 메뉴로는 뭘 하실건가요?
- 손님 : 불고기 버거와 감자튀김이요.
- 종업원 : 음료로는 뭘 주문하시겠어요?
- 손님 : 불고기 버거, 감자튀김과 콜라요
위의 차이를 느낄 수 있나요? 스테이트리스 할 때는 종업원에서, 즉 서버 쪽에서 기존의 요청을 기억하고 있지 않기 때문에 모든 요청 정보를 같이 전달해야 합니다. 이처럼 요청을 처리하는데 필요한 정보를 모두 포함되어 있는 메시지를 가리켜 '자기 기술적 메시지(Self Descriptive Message)'라고 합니다. 이와달리 스테이트풀 할 때는 요청으로 다시 기존 메시지를 전달하지 않아도 되는 이유는 서버의 세션에서 기억하고 있기 때문입니다.
HTTP 메서드
HTTP 메서드는 총 8가지가 있습니다. GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE, CONNECT인데요. 메서드 수는 고작 8개 밖에 없지만 반대로 이렇게 적기 때문에 지금까지 큰 혼란없이 웹이 발전될 수 있었습니다. 각각 메서드의 의미를 정리해볼게요.
- GET : 리소스 취득
- POST : 서브 리소스의 작성, 리소스 데이터의 추가, 그 밖의 처리
- PUT : 리소스 갱신, 리소스 작성
- DELETE : 리소스 삭제
- HEAD : 리소스의 헤더(메타 데이터) 취득
- OPTIONS : 리소스가 서포트하는 메서드의 취득
- TRACE
- CONNECT
TRACE, CONNECT 은 많이 사용되는 것이 아니라 따로 설명은 적어두지 않았습니다. HTTP 메서드에 대해 멱등성, 안전성에 대해 얘기를 하는데요. 일단 멱등성과 안전성에 대해 정리하고 갈게요.
- 멱등성 : 몇 번을 실행해도 결과가 같은 것
- 안전성 : 조작 대상의 리소스의 상태를 변경시키지 않는 것
이렇게 생각하면 GET, POST, PUT, DELETE 특성을 다음과 같이 생각할 수 있을 것 같아요. 그리고 HTTP 메서드의 활용에 대해 잘 안다면 각각의 메서드에 대한 멱등성과 안전성의 특성을 잘 이해할 수 있을 것 같네요.
- GET, HEAD : 멱등이고 안전하다
- PUT, DELETE : 멱등이지만 안전하지 않다
- POST : 멱등하지도, 안전하지도 않다
HTTP 메서드가 위와 같이 몇 개로 한정하여 고정시켰기 때문에 프로토콜이 심플하게 유지되었고 웹은 성공할 수 있었습니다. 그리고 그 뒤엔 위와 같은 통일 인터페이스 제약이 있었기 때문에 가능한 것이었습니다.
'CS' 카테고리의 다른 글
프로세스와 쓰레드 (0) | 2019.02.25 |
---|---|
프로세서와 코어의 차이점 (2) | 2019.02.08 |
Sync Async Block Non-Block (0) | 2019.01.31 |
TCP/IP (0) | 2019.01.30 |