당신은 HTTP를 얼마나 아는가? 1편
요청, 응답
1. TCP를 이용하면 Server -> Client로 요청이 가능하다?
HTTP는 Client -> Service 단방향 요청 시작만 가능합니다!
TCP도 Client에서 ACK을 보내면 Server가 SYN/ACK을 보내는 것으로 3-Way-HandShaking이 시작 되죠!
2. 리스폰스 메시지는 메소드, URI, 프로토콜 버전, 옵션 리스폰스 헤더 필드와 엔티티로 구성된다?
땡!!!
리스폰스 메시지는 프로토콜 버전, 상태 코드, 프레이즈, 옵션 리스폰스 헤더 필드, 바디로 구성됩니다!!
리퀘스트 메시지가 메소드, URI, 프로토콜 버전, 옵션 리퀘스트 헤더 필드와 엔티티로 구성되죠!!
3. HTTP는 무상태성(stateless) 프로토콜이다?🤔
맞습니다!!! HTTP 프로토콜은 이전 리퀘스트나 리스폰스를 스스로 기억할 수 있는 구조가 아니죠!!!🤸♂️
이러한 구조 덕분에 자유롭게 서버 자원을 늘리더라도 어떤 서버도 대응할 수 있는 구조가 되어 범위성(scalability)를 지킬 수 있습니다!!!👍.
그러나 모든 경우에 stateless가 가능한 건 아니죠😮!!!
그렇다면 로그인 이후에도 페이지를 이동할 때마다 비밀번호를 보내줘야 할까요?
그래서 나온 것이 쿠키(Cookie)입니다 쿠키로 인해 HTTP를 이용한 통신에서도 상태를 계속 관리할 수 있게 되었습니다👍.
4. 요청에 관한 응답이 오지 않으면 새로운 요청을 보내는 것이 불가능하다?
아니죠😱!!! HTTP는 지속 연결(Persistent Connections)를 지원하기 때문에 어느 한 쪽이 명시적으로 연결을 종료하지 않는 이상 TCP 연걸을 계속 유지합니다.
또한 파이프 라인화(HTTP pipelineing)을 지원해서 리스폰스를 기다리지 않고 바로 다음 리퀘스트를 보낼 수 있습니다!!!👻
5. 쿠키는 Client에서 보낸 Set-Cookie라는 헤더 필드에 의해 Server 혹은 Proxy에 보존된다?
땡때래댕땡땡😭!!! 쿠키는 서버에서 리스폰스로 보내진 Set-Cookie 라는 헤더 필드에 의해 쿠키를 클라이언트에 보존합니다!
서버는 클라이언트가 보내온 쿠키를 확인해서 클라이언트를 식별하고 서버의 데이터를 확인하여 이전 상태를 알 수 있습니다.
HTTP 메소드
5. GET에도 메시지 바디에 데이터를 담아서 전송이 가능할까?
맞습니다!! GET으로 전송하더라도 메시지 바디에 엔티티를 담을 수 있죠! 하지만 일반적으로 GET 요청에 파라미터를 전송할 땐 쿼리스트링으로 넘어오는 데이터를 기대하므로 담지는 않습니다.
6. PUT은 요청에 포함된 엔티티를 URI로 지정한 곳에 보존하도록 요구한다?
맞습니다💯💯!!! PUT 메서드는 클라이언트로부터 요청된 엔티티를 서버에 저장하기 위해 사용되죠!!!
PATCH와의 차이는 PUT은 요청 전체를 저장하는 반면 PATCH는 요청을 기반으로 서버의 값을 수정합니다.
7. POST로 URI에 존재하는 리소스를 삭제하도록 요청할 수 있다?
맞습니다💯!!! 이럴 때는 보통 DELETE가 가장 적합합니다. 하지만 GET, POST 이외의 HTTP 메소드를 지원하지 않는 웹페이지가 많아서 단순 조회 이외의 모든 기능을 POST로 처리하는 경우가 있습니다.
우리는 REST하게 개발하기 위해 자원을 기준으로 적절하게 메소드를 사용하는 게 좋겠죠?🌟🤸
참고
우에노 센, 이병억 역, 그림으로 배우는 HTTP Network Basic, 영진 닷컴