1️⃣ HTTP Message
'HTTP Message' 는 서버와 클라이언트 간 데이터가 교환되는 방식이다.
메시지 타입엔 두 가지가 있다.
- 요청 (Request) : 클라이언트가 서버로 데이터를 전달하여 필요한 동작을 요청한다.
- 응답 (Response) : 클라이언트의 요청에 대한 서버의 답변이다.
HTTP 메시지 는 ASCII 로 인코딩된 텍스트 정보이며, 각각의 정보가 그 역할에 맞게 구분되어 구성된다.
예전 HTTP/1.1 에서는 클라이언트와 서버와의 연결을 통해 공개적으로 전달되었으나, HTTP/2 에서는 최적화와 성능 향상을 위해 HTTP 프레임으로 나누어진다.
위 그림처럼 HTTP 메시지는 다양한 방식으로 제공되는데 API, 설정 파일, HTML 폼 등의 방식이 있다.
HTTP/ 의 이진 프로이밍 메커니즘은 사용 중인 API 나 설정 파일 등을 변경하지 않아도 되기에 사용자가 보고 쉽게 이해할 수 있다.
HTTP 요청과 응답은 구조가 비슷하며, 크게 세 부분으로 구분된다.
보통 시작 줄, 헤더, 본문으로 구성된다.
2️⃣ HTTP Request (요청)
1. Start-Line (시작 줄)
시작 줄에는 실행되어야 하는 요청, 요청 수행에 대한 성공 또는 실패가 기록된다. 한 줄이다.
기본 형식은 다음과 같다.
[ HTTP 메서드 ] [ URL /프로토콜/포트/도메인 등 절대 경로] [ 프로토콜 버전 ]
1) HTTP 메서드
HTTP 메서드는 서버가 수행해야 하는 동작을 나타낸다.
GET, PUT, POST, PATCH, DELETE 등의 동사가 올 수도 있고 HEAD, OPTIONS 등의 명사가 올 수 있다.
각각의 방식에 대해서는 다음에 더 자세히 다뤄보겠다.
2) 요청 타켓
주로 URL, 프로토콜, 포트, 도메인 등의 절대 경로로 나타낼 수 있다. 요청 컨텍스트에 의해 특정지어지며, 포맷은 HTTP 메서드에 따라 달라질 수 있다.
3) HTTP 버전
HTTP 버전을 나타내며, 응답 메시지에서 써야 할 HTTP 버전을 알려준다.
HTTP/1.1 , HTTP/2 등이 있다.
GET http://www.google.com HTTP/1.1
이는 GET 방식으로 구글에 요청을 보내며 HTTP/1.1 버전을 사용한다는 뜻이다.
2. Header (헤더)
헤더는 HTTP 헤더의 기본 구조를 따른다. 대소문자 구분 없는 문자열 뒤에 콜론 ':' 이 붙으며, 뒤에 오는 값은 헤더에 따라 달라진다. 헤더는 크게 네 가지로 나눌 수 있는데 다음과 같다.
- General Header : 요청과 응답 모두에 적용되지만, 바디에서 실제로 전송되는 데이터와는 무관하다.
- Request Header : 헤더의 요청 내용을 자세히 명시한다. 즉 리소스나 클라이언트에 대한 정보를 포함한다.
- Response Header : 위치 또는 서버에 대한 정보와 같이 응답에 대한 추가 정보를 갖는다.
- Entity Header : 요청 본문에 적용되는 헤더이다. 본문은 있을 수도, 없을 수도 있다.
헤더의 종류는 그 용도와 목적에 따라 다양하다. 다음에 헤더에 대한 자세한 내용을 다루겠다.
색칠되지 않는 부분은 Start Line 으로, HTTP 메서드, HTTP 버전을 알려준다.
1) Request Headers
- Host : 서버의 도메인명과 서버가 받는 TCP 포트 번호 명시
- User-Agent : 사용자 에이전트의 애플리케이션 타입, OS, 소프트웨어 버전/벤더 등을 포함한다.
- Accept : 반환할 데이터 타입을 서버에 알려주며, MIME 타입이다.
- Accept-Language : 서버가 돌려줄 예상 언어에 대해 서버에 알려준다. en-US 등이 있다.
- Accept-Encoding : 인코딩 알고리즘에 대해 서버에 알려준다. 정보를 인코딩하여 알려주는 것이 좋다. (압축 알고리즘)
2) General Headers
- Connection : 현재 트랜잭션이 끝난 뒤 네트워크 연결을 열린 상태로 둘지 여부를 제어한다. 여기서 'keep-alive' 옵션은 지속적인 연결 text-align: start;">이 열린 상태로 유지할 기간을 제어한다.
- Upgrade-Insecure-Requests : 암호화된 응답, 인증된 응답에 대한 클라이언트 설정 신호를 서버에 전송한다.
3) Representation Headers
- Content-Type : 수신자에게 전송할 자원의 형식
- Content-Length : 사용자를 위한 언어를 설명하여 사용자가 선호하는 언어에 따라 구분되게 한다.
3. 본문
본문은 요청의 마지막 부분에 들어가며, 일부 요청에는 들어가지 않는다.
GET, DELETE, HEAD, OPTIONS 등의 요청은 리소스를 가져오는 메서드이다. 따라서 본문이 필요 없다.
PUT, PATCH 등의 메서드는 서버에 요청할 리소스를 본문에 담아 보낸다.
요청 타입은 여러 가지가 있다. 요즘은 대부분 'JSON' 방식을 사용한다.
이외에도 TEXT, HTML, XML 등이 있다.
3️⃣ HTTP Response (응답)
1. Start-Line (시작 줄)
시작 줄에는 실행되어야 하는 요청, 요청 수행에 대한 성공 또는 실패가 기록된다.
기본 형식은 다음과 같다.
[ 프로토콜 버전 ] [ 상태 코드 ] [ 상태 텍스트 ]
- 프로토콜의 버전은 HTTP/1.1 , HTTP/2 등 말 그대로 프로토콜의 버전을 나타낸다.
- 상태 코드는 요청의 성공 여부를 나타낸다. 200, 404, 302 등이 있다.
- 상태 텍스트는 상태 코드에 대한 설명을 짧은 글로 나타낸다.
예시) HTTP/1.1 404 Not Found. (정말 무서운 결과이다.)
2. Header (헤더)
응답의 HTTP 헤더는 다른 헤더와 구조가 같다. 크게 세 가지로 나눌 수 있다.
1. General Header : 메시지 전체에 적용 될 수 있다.
2. Response Header : 상태 줄에 미처 담지 못한 서버에 대한 추가 정보를 제공한다.
3. Entity Header : 요청 내에 본문이 있는 경우, 본문의 내용과 관련된 정보를 제공한다.
3. 본문
본문은 요청과 마찬가지로 마지막 부분에 들어가며, 모든 응답에 본문이 들어가지는 않는다.
보통 201, 204와 같은 상태 코드를 가진 응답엔 본문이 없다.
4️⃣ 결론
요즘 다시 스프링 공부를 열심히 하고 있다. 기본적인 개념을 배우고 슬슬 웹 기술들을 공부하는 중이다.
Servlet, JSP, MVC 패턴 등등 웹 관련 기술을 공부하려면 당연히 웹에 대한 지식이 있어야 할 것이다.
HTTP 와 메시지는 필수로 알아야 한다고 느꼈다. 단순히 코드만 작성하는 것이 아니라, 웹의 동작 방식과 네트워크 등 기초 지식이 탄탄해야 위 내용들을 공부하는데에 도움이 많이 될 것이다.
CS 지식도 하루에 30분 정도 공부해야겠다.
아직 할게 너무너무 많지만 화이팅.
참고 : https://developer.mozilla.org/ko/docs/Web/HTTP/Messages