서버와 클라이언트의 약속, HTTP
요청에요청을F12 클릭시 Transaction , HTTP 헤더 분석
Headers : HTTP 헤더에 대한 정보를 보여 준다. 요청에 대한 헤더와 응답에 대한 헤더를 나눠서 볼 수 있다.
Payload : Payload 라는 용어 자체가 데이터 전송에 포함되는 내용의 데이터를 의미한다. HTTP 요청은 헤더(header)와 바디(Body) 부분으로 나뉘므로 요청의 바디에 해당하는 데이터가 있는 경우에는 해당 탭에서 확인 가능하다. 현재 www.google.com에 접속할 때는 요청의 바디가 없기 때문에 탭이 보이지 않는 것이다.
Preview : 응답의 바디에 포함된 데이터를 보기 좋은 형태의 미리보기로 제공한다. 앞서 JSON 데이터를 자바스크립트 객체 형태로 보여 줬던 것이 이 탭에 해당된다. 만약 응답의 바디에 HTML 문서가 있다면 웹 브라우저에 보이는 것처럼 미리보기할 수 있다. 이미지 파일 역시 여기서 볼 수 있다.
Response : [Preview] 탭과 동일하게 응답의 바디에 포함된 데이터를 보여 주지만, 있는 그대로 보여준다. JSON 문자열을 그대로 보거나 HTML 문서를 그대로 볼 수 있다. 마찬가지로 이미지 파일도 바이너리 데이터로 보여줄 것같지만, 바이너리 데이터로 보여주지않고 this request has no response data available이라는 문구가 나온다.
initiater
Timing
Cookies
HTTP 트랜잭션은 HTTP 요청과 응답이 하나의 묶음으로 이루어진다는 의미를 가지고 있지만 일반적으로 사용되는 트랜잭션이라는 표현은 보통 쪼개질 수 없는 처리를 의미한다.
HTTP의 특징
HTTP/1.1 버전에 기반한 HTTP의 대표적 특징
HTTP는 클라이언트의 요청으로 HTTP 트랜잭션이 시작된다. HTTP의 등장 초기에는 단순히 HTTP 문서 하나에 대한 HTTP 요청이 주를 이루었지만, 점점 다양한 서비스 요구사항에 의해 다양한 형태로 서버의 리소스를 제공하게 되었다. 클라이언트가 먼저 요청을 시작한다는 HTTP의 특징은 서버에서 데이터를 줘야 할 때 실시간으로 줄 수 없다는 한계가 있어 웹 소켓과 같은 기술이 도입되기도 했다.
HTTP는 상태를 가지지 않는다. 쉽게 이야기 하면 이전 HTTP 트랜잭션과 다음 HTTP 트랜잭션 사이에 연관 관계가 없다. 서버는 지금 요청을 한 클라이언트와 잠시 후 요청한 클라이언트가 설령 같은 클라이언트라고 하더라도 구분할 수 없다. 이러한 특징을 HTTP는 무상태성이다 라고 표현한다.
HTTP는 비연결성을 갖는다.
HTTP는 데이터를 주고 받기 위해 연결이라는 과정이 필요하고 ,HTTP 트랜잭션이 종료되면 연결을 끊어 버린다.
장점으로는 클라이언트와 서버의 자원을 효율적으로 사용할 수 있다.
단점으로는 매번 HTTP 트랜잭션마다 연결을 맺고 끊는 과정이 추가되어야 한다.
HTTP 1.1 외의 버전
HTTP 0.9 버전
단순히 GET이라는 하나의 메서드만 지원
HTTP 1.0
POST와 HEAD 메서드, 상태 코드와 여러 가지 헤더 추가
HTTP 1.1
커넥션에 대한 지속적인 연결(Persistent Connections)가 추가됨
HTTP 2 버전
하나의 커넥션에서 여러 개의 요청을 동시에 다중(Multiplex) 처리할 수 있다.
헤더를 압축한다.
서버에서 예상되는 요청을 미리 클라이언트에 전송한다.
웹 브라우저로 웹 서핑을 하면 하나의 HTML 페이지를 먼저 다운로드하고 거기에 포함된 여러 개의 CSS, 자바스크립트, 이미지 파일을 연달아 받는 상황이 흔히 발생한다. 이런 상황에서 HTTP/1.1 은 파이프라이닝이라는 방법으로 하나의 커넥션을 통해 요청과 응답을 처리하도록 개선했다. 그러나 여기에는 반드시 '요청한 순서와 동일하게 응답이 와야 한다' 라는 제약이 있어, 앞쪽 요청에 대한 처리가 늦어지면 뒤쪽 요청에 대한 처리 역시 늦어진다는 문제가 있었다. HTTP/2 는 다중화를 통해 요청한 순서에 상관없이 응답이 오는 대로 처리할 수 있도록 개선했다.
HTTP 3
QUIC라는 UDP를 사용하는 프로토콜 사용, TCP가 해주던 기능이 필요하면 UDP 프로토콜 위에 필요한 부분만 추가로 구현하면 되기 때문에 효율적이다.
HTTP 요청 메서드들
같은 경로에 대한 HTTP 요청이더라도 메서드에 따라 동작이 달라진다. 아니, 달라지도록 개발해야 한다. 앞으로 어떤 메서드를 사용할지 고민하게 되는 상황이 많을 것이다.
행위별로 적절한 HTTP 메서드 연결하기
모질라(Mozila)에서 제공하는 HTTP 요청 메서드 리스트를 보면 여러 가지 HTTP 메서드가 있지만 실제로 많이 사용되는 HTTP 요청 메서드는 다음과 같이 정해져 있다.
GET : 특정 자원에 대한 조회를 요청하는 메서드이다.
HEAD : GET 메서드에 대한 요청과 동일한 효과를 내지만, 바디를 제외한 헤더 부분만 응답으로 받는 메서드이다.
POST : 새로운 자원 생성을 요청하는 메서드이다. 새로운 자원은 요청 바디에 있는 내용을 바탕으로 생성된다.
PUT : 기존에 있던 자원을 요청 바디에 있는 내용으로 변경하는 메서드이다.
PATCH : PUT 처럼 기존 자원을 변경하지만 해당 자원의 전체를 변경하는 것이 아니라 일부만 변경한다.
DELETE 특정 자원을 제거한다.
OPTIONS : 해당 경로에서 어떤 HTTP 요청 메서드를 사용할 수 있는지 알려 준다.
안전한 메서드와 멱등성 있는 메서드
안전한 메서드라는 것은 대상이 되는 자원의 상태를 변경하지 않는 메서드라는 의미이다. 즐겨찾기 서비스라면 즐겨찾기의 이름을 변경하거나 즐겨찾기의 URL을 변경하지 않는 메서드를 안전한 메서드라고 할 수 있다. HTTP/1.1 명세 문서를 살펴보면 GET, HEAD, OPTIONS 가 각각 안전한 메서드라고 나와 있다. HEAD와 OPTIONS에는 보통 @RequestMapping을 추가해 줄 필요없이 GET 메서드로 @RequestMapping을 추가하면 WAS가 자동으로 생성해 준다. 결국 GET 메서드만 만들어 주면 되는데, 중요한 점은 GET 메서드 API도 '안전한 메서드'로 만들어야 한다는 것이다.
다음은 멱등성이다. 멱등성이란 '한 번 호출한 것과 여러 번 호출한 것이 같은 자원의 상태를 가지는 것'을 의미한다. POST는 대표적인 멱등성이 없는 메서드이다. 멱등성이 있는 메서드는 대표적으로 GET, PUT, DELETE가 있다. 안전한 메서드 GET은 당연히 멱등성도 있다고 할 수 있다. 호출해도 자원의 상태가 바뀌지 않기 때문이다. PATCH 역시 멱등성이 없는 메서드이다.
생성하기(POST) - 생성하기는 멱등성이 없으므로 POST 메서드가 적절하다.
읽기(GET) - 읽기 연산은 안전해야 하므로 GET 메서드가 적절하다.
수정하기(PUT) - 수정하기는 보통 멱등성이 있다. 동일한 내용으로 요청하면 한 번 수정된 후 동일한 상태를 가지기 때문이다. 맥락상 수정한다는 의미에서 PUT이 적절하기도 하다. 자원의 일부만 수정하는 기능이면서 멱등성이 없다면 PATCH를 고려해 볼 수도 있다.
삭제하기(DELETE) - 삭제하기는 보통 멱등성이 있다. 데이터베이스를 사용하면 자원마다 고유한 ID를 가지게 된다. 삭제하기는 해당 ID를 기준으로 삭제를 요청하기 때문에 한 번 삭제된 후로는 동일하게 자원이 삭제된 상태를 유지하게 된다. 따라서 삭제하기는 멱등성이 있다.
두 가지 규칙 준수!
GET은 반드시 안전한 메서드여야 한다.
PUT , DELETE는 멱등성이 있는 메서드여야 한다.
HTTP 응답 상태 코드
1xx
정보성 상태 코드
요청을 받았으나 무언가 계속되는 상태를 나타낸다.
2xx
성공을 의미하는 상태 코드
요청을 성공적으로 수신/이해/수락했다는 것을 의미한다.
3xx
리다이렉트(Redirect)를 의미하는 상태 코드
요청을 서버에서 처리하지 않고 다른 곳으로 유도한다. 리다이렉트되는 경우 2번의 HTTP 트랜잭션이 발생한다.
4xx
클라이언트 오류에 해당하는 상태 코드
잘못된 구문이 포함되어 있거나 어떤 이유에 의해 수행할 수 없다는 것을 의미한다.
5xx
서버 오류에 해당하는 상태 코드
Last updated