HTTP Request Message
HTTP 메시지는 서버와 클라이언트 간에 데이터가 교환되는 방식이다. 요청(request)은 클라이언트가 서버로 전달하여 서버의 액션이 일어나도록 한다. 응답(response)는 요청에 대한 서버의 답변이다.
HTTP 메시지의 구조
다음의 HTTP 요청(Request) 메시지의 구조이다.
시작 줄(Start-line)와 HTTP 헤더를 포함하는 요청 헤드(head)와 본문과의 구분을 위한 공백 라인, 본문으로 구성된다.
요청 헤드(head)
시작 줄
실행되어야 할 요청이 기록되어 있다. 다음 세가지 요소로 이루어져 있다.
1. HTTP 메소드: GET, PUT, POST 등
2. 요청 타겟
주로 URL, 또는 프로토콜, 포트, 도메인의 절대 경로. HTTP 메소드에 따라 달라진다.
3. HTTP 버전
응답 메시지에서 써야 할 HTTP 버전을 알려주는 역할
HTTP 헤더
[이름]: [값] 형식으로 이루어진다. (ex. Host: localhost:8000)
요청의 내용을 구체화하거나 컨텍스트를 제공, 조건에 따른 제약 사항을 주어 요청 내용을 수정한다.
예를 들면
- Accept: 돌려줄 데이터 타입에 대해 서버에 알린다.
- Referer: 현재 페이지로 연결되는 링크가 있던 이전 웹 페이지의 주소
- Content-Type: (본문이 있는 경우) 어떤 유형의 데이터가 실제로 전송됐는지
본문(body)
HTTP 메시지의 payload(전송되는 순수한 데이터)
본문이 있는 경우, Content-Type 헤더를 명시해주어야 한다.
리소스를 가져오는 요청(GET, DELETE 등)에는 본문이 필요 없다.
HTTP 요청 메소드
GET
특정한 리소스를 가져오도록 요청한다.
쿼리스트링을 통해 데이터를 포함시킨 URL에 대해 요청한다. 중요 정보가 URL에 노출되기 때문에 보안에 취약하다는 단점을 가지고 있다.
www.example.com?id=exId&pass=exPwd
불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다. 데이터가 크고 변경될 일이 적은 정적 콘텐츠(CSS, JS, 이미지)에 대해서 반복해서 요청하는 것을 방지할 수 있다. 이러한 요청에 대해서 브라우저는 자료 저장소에 데이터를 캐싱해둔다.
POST
서버로 데이터를 전송한다.
전송할 데이터는 Body에 담아서 전송한다.
Content-Type 헤더로 데이터의 타입을 명시한다. 다음은 타입의 예이다.
- multipart/form-data
- text/plain
- image/jpeg
GET와 POST의 차이
1. GET 요청은 캐싱된다.
2. GET 요청은 브라우저 기록에 남는다.
3. GET 요청은 북마크에 추가할 수 있다.
4. POST 요청에는 데이터 길이에 대한 제한이 없다.
GET 요청 시 URI 길이에는 제한이 있을 수 있다. 이렇게 말하는 이유는 웹 플랫폼에서는 공식적으로 URI 길이에 제한을 두고 있지는 않기 때문이다. 브라우저의 정책마다 다르며, 크롬의 경우 2MB로 길이를 제한하고 있다.
5. HTTP 응답 코드
- GET: 200 (Ok)
- POST: 201 (Created)
6. GET은 리소스를 요청할 때, POST는 리소스를 생성할 때 사용한다.
7. GET 요청 시에는 쿼리스트링을 통해, POST 요청 시에는 HTTP Body를 통해 데이터를 전달한다.
8. 멱등성(idempotency)
idempotent하다는 것은 동일한 연산을 여러 번 적용하더라도 결과가 달라지지 않음을 의미한다.
GET 요청은 idempotent하지만, POST는 non-idempotent하다.
즉, 동일한 GET 요청을 여러 번 했을 때 동일한 응답이 돌아온다. GET은 서버의 데이터나 상태를 변경하지 않아야 하기 때 데이터를 조회할 때 사용해야 한다.
반대로 동일한 POST 요청에 대한 응답은 다를 수 있다. POST는 서버의 상태나 데이터를 변경시킬 때 사용하게 된다.
참고
https://developer.mozilla.org/ko/docs/Web/HTTP/Messages
https://han-joon-hyeok.github.io/posts/Comparison-of-GET-POST/
https://whales.tistory.com/120
'웹 개발' 카테고리의 다른 글
CSR과 SSR의 차이점 (0) | 2024.03.12 |
---|---|
쿠키, 세션, 웹 스토리지의 차이점 (0) | 2024.03.10 |
브라우저의 작동 방식 (0) | 2024.03.09 |
비동기 프로그래밍 (0) | 2024.03.08 |
Virtual DOM과 (Real) DOM의 차이 (0) | 2024.03.05 |