새싹에서 1,2차 프로젝트를 하면서 모두 Http로 배포를 하였는데요! 오늘은 이 HTTP에 대해서 꼼꼼히 살펴보도록 하겠습니다!
1. HTTP 헤더(header)
사용자가 HTTP요청을 하게 되면 헤더와 바디를 주고 받습니다.
여기에서 Headers에 있는 컨텐츠를 헤더!
Body에 있는 컨텐츠를 바디라고 합니다! 당연하죠?ㅎㅎ
바디는 본문이라고 할 수 있으며 서버에서 보내고자하는 컨텐츠 본문인 JSON, html, image등이 담깁니다.
우리가 보통 api요청을 하면 JSON이 왔지만, 특정한 경우에 에러가 올때... 특히 502에러같은게 나오면 html이 오는 경우를 종종 봤었죠..?
헤더는 바디를 설명하는 정보를 포함해서 여러가지 정보가 담긴 정보 묶음이라고 보면 됩니다!
즉, HTTP전송에 필요한 모든 부가 정보들이 들어있는게 헤더입니다!!
그럼 이 부가정보들에는 어떤 것들이 담기는 지 알아보겠습니다!
(1) 표현
- Content-Type: 표현 데이터의 형식을 설명
ex)
- text/html; charset=utf-8
- application/json
- image/png
- Content-Encoding: 표현 데이터의 압축 방식
- 표현 데이터를 압축하기 위해 사용
- 데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가
- 데이터를 읽는 쪽에서 인코딩 해더의 정보로 압축 해제
- ex) gzip, deflate, identity(압축안함!)
- Content-Language: 표현데이터의 자연 언어
- ex) ko, en, en-US
- Content-Length: 표현 데이터의 길이
- byte단위
- Transfer-Encoding(전송코딩)을 사용하면 Content-Length를 사용하면 안됨
- **Transfer-Encoding(전송코딩)?? HTTP 1.1에서 사용되며, 메시지 본문의 인코딩 방법을 정의합니다. Transfer-Encoding은 원본 데이터를 클라이언트에게 전송하기 전에 압축하거나 인코딩하는 데 사용됩니다.가장 일반적인 Transfer-Encoding 값으로는 "chunked"가 있습니다. 이는 데이터를 여러 청크로 나누어 전송하는 데 사용되며, 청크 크기와 마지막 청크의 크기가 명시됩니다. 이렇게 함으로써 전체 메시지가 한 번에 전송되지 않고 일부분씩 전송되므로 대용량 데이터를 효율적으로 전송할 수 있습니다.Transfer-Encoding은 클라이언트가 메시지 본문을 해독하기 위해 필요한 추가적인 처리를 수행할 수 있게 하여, 다양한 인코딩 방식을 지원합니다. 일반적으로 웹 브라우저와 웹 서버는 이 헤더를 사용하여 효율적인 데이터 전송을 달성합니다.
- 협상(content negotiation): 클라이언트가 선호하는 표현 요청
- Accept: 클라이언트가 선호하는 미디어 타입 전달(클라이언트가 원하는 미디어 타입을 서버가 주세요..)
- Accept-Charset: 클라이언트가 선호하는 문자 인코딩(클라이언트가 원하는 문자 인코딩을 서버가 있으면 주세요..)
- Accept-Encoding: 클라이언트가 선호나는 압축 인코딩(클라이언트가 선호나는 압축 인코딩을 주세요..)
- Accept-Language: 클라이언트가 선호하는 자연언어(ex. 클라이언트가 한국에 살고 있으면 서버한테 한국어를 줄 수 있으면 달라고 하는 것!)
- 협상헤더는 요청시에만 사용
이렇게 헤더에는 콜론(:)으로 서로 구분되는 key-value형태로 설정이 됩니다!
HTTP요청을 할 때 3가지의 헤더인 일반헤더, 요청헤더, 응답헤더가 자동으로 생깁니다.
(2) 일반헤더
요청한 URL, 요청 메서드, 해당 자원을 요청할 때 해당자원의 출처를 나타내는 URL을 노출시킬지 말지를 정하는 보안정도가 설정되어 있는 Referrer Policy등이 들어갑니다!
(3) 요청헤더
요청헤더는 클라이언트가 서버에 요청할 때 클라언트가 설정하는 또는 자동으로 설정되는 헤더를 말합니다. 요청헤더에는 메서드, 클라이언트의 OS, 브라우저 정보 등이 담깁니다.
(4) 응답헤더
응답헤더는 서버가 클라이언트에게 응답을 보낼 때 설정 하는 또는 자동으로 설정되는 헤더를 말합니다. 응답헤더는 서버의 소프트웨어 정보 등이 담깁니다. 예를들어 nginx를 프록시서버로 두었다면 해당 정보가 표기됩니다. 하지만, 대부분의 서버는 일반적으로 해커가 서버에서 어떤 소프트웨어를 사용되고 있는지 알기 어렵게 하기 위해 서버 정보를 숨깁니다.
사실 헤더만해도 엄청난 양인데 압축해서 정리해보았습니다! 헤더에 대해서 다음에 한번 더 자세하게 살펴보고 다음 포스팅에서는 HTTP의 역사(?)에 대해서 자세히 살펴보도록 하겠습니다!
'네트워크' 카테고리의 다른 글
RefreshToken & AccessToken (0) | 2024.02.19 |
---|---|
Session VS JWT Token (0) | 2024.02.19 |
[네트워크] HTTPS와 TLS(SSL) (2) | 2024.01.25 |
[네트워크] HTTP 심화-(2)HTTP/2 vs HTTP/3 (3) | 2024.01.25 |
[네트워크] HTTP 심화-(1)HTTP/1.0 vs HTTP/1.1, keep-alive, HOL (2) | 2024.01.25 |