반응형

# 모든 개발자를 위한 HTTP 웹 기본 지식 학습

# 협상 헤더(콘텐츠 네고시에이션)

  • 클라이언트가 선호하는 표현 요청
  • Accept : 클라이언트가 선호하는 미디어 타입 전달
  • Accept-Charset : 클라이언트가 선호하는 문자 인코딩
  • Accept-Encoding : 클라이언트가 선호하는 압축 인코딩
  • Accept-Language : 클라이언트가 선호하는 자연 언어
  • 협상 헤더는 요청시에만 사용

## 협상 헤더 적용 사례 1

  • Accept-Language 적용 전
한국어 브라우저 사용
/event
GET /evnet
로 보내면


다중 언어 지원 서버
1. 기본 영어(en)
2. 한국어 지원(ko)
Content-Language: en
hello (영어)
로 응답
  • Accept-Language 적용 후
한국어 브라우저 사용
/event
GET /evnet
Accept-Language: ko
로 보내면(Accept-Language 포함하여 전달)


다중 언어 지원 서버
1. 기본 영어(en)
2. 한국어 지원(ko)
Content-Language: ko
안녕하세요
로 응답

## 협상 헤더 사용 사례 2 (Accept-Language 복잡한 예시)

한국어 브라우저 사용
/event
GET /evnet
Accept-Language: ko
로 보내면(Accept-Language 포함하여 전달)


다중 언어 지원 서버
1. 기본 독일어(de)
2. 영어도 지원(en)
Content-Language: de
Hallo(독일어)
로 응답

## 협상과 우선순위 1

  • Quality Values(q) 값 사용
  • 0~1, 클수록 높은 우선순위
  • 생략하면 1
Accept-Language: ko-KR, ko; q=0.9, en-US; q=0.8, en; q=0.7

1 순위. ko-KR; q=1 (q생략)
2 순위. ko; q=0.9
3 순위. en-US; q=0.8
4 순위. en; q=0.7

## 협상 헤더 사용 사례 2 (Accept-Language 복잡한 예시) - 해결

한국어 브라우저 사용
/event
GET /evnet
Accept-Language: ko-KR, ko; q=0.8, en-US; q=0.8, en; q=0.7
로 보내면(Accept-Language / 우선순위 포함하여 전달)


다중 언어 지원 서버
1. 기본 독일어(de)
2. 영어도 지원(en)
Content-Language: de
Hello(영어)
로 응답

## 협상과 우선순위 2

  • 구체적인 것이 우선한다.
Accept: text/*, text/plain, text/plain;format=flowed, */*

1 순위. text/plain; format=flowed
2 순위. text/plain
3 순위. text/*
4 순위. */*

## 협상과 우선순위 3

  • 구체적인 것을 기준으로 미디어 타입을 맞춘다.
Accept: text/*; q=0.3, text/html; q=0.7, text/html;level=1, text/html; level=2; q=0.4, */*; q=0.5

Media Type : text/html; level=1 일 때 Quality : 1
Media Type : text/html 일 때 Quality : 0.7
Media Type : text/plain 일 때 Quality : 0.3
Media Type : image/jpeg 일 때 Quality : 0.5
Media Type : text/html; level=2 일 때 Quality : 0.4
Media Type : text/html; level=3 일 때 Quality : 0.7

 

# 전송 방식

  • Transfer-Encoding
  • Range, Content-Range

## 전송 방식 설명

  • 단순 전송
  • 압축 전송
  • 분할 전송
  • 범위 전송

## 단순 전송

  • Conten-Length
  • 요청을 하면 응답을 주는데, 메시지 바디에 대한 길이값을 지정하는 것
  • 한번에 요청하고 한번에 쭉 받는 것
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 3423

<html>
	<body> ... </body>
</html>

## 압축 전송

  • Content-Encoding
  • 서버에서 압축을 통해 용량을 줄이고, Content-Encoding을 설정(어떤 걸로 압축되어있는지)
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Content-Length: 521

lkj123kljoiaasdasdskljsdfj

## 분할 전송

  • Transfer-Encoding
  • 보낼 때 덩어리로 쪼개서 보내겠다는 것 (용량이 큰 것을 분할 전송하여 빠르게 전송)
  • Content-Length 넣으면 안됨 ( 처음에 Content-Length 예상 불가능)
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

5
Hello
5
World
0
\r\n

## 범위 전송

  • Range, Content-Range
  • 예) 이미지 전송 중 절반정도 받았을 경우 중간에 끊기면 다시 요청 해야 하는데, 처음부터 다시 요청하게 되면 용량 낭비, 그러므로 범위 전송을 통해 범위 설정
클라이언트
GET /event
Range: bytes=1001~2000


서버
HTTP/1.1 200 Ok
Content-Type: text/plain
Content-Range: bytes 1001~2000 / 2000

qweqwewq123qwedaswe

 

# 일반 정보

  • From : 유저 에이전트의 이메일 정보
  • Referer : 이전 웹 페이지 주소
  • User-Agent : 유저 에이전트 애플리케이션 정보
  • Server : 요청을 처리하는 오리진 서버의 소프트웨어 정보
  • Date : 메시지가 생성된 날짜

## From

  • 유저 에이전트의 이메일 정보
  • 일반적으로 잘 사용되지 않는다.
  • 검색 엔진 같은 곳에서 주로 사용
  • 요청에서 사용

## Referer

  • 이전 웹 페이지 주소
  • 현재 요청된 페이지의 이전 웹 페이지 주소
예)

구글에서 특정 입력 값 검색 후 개발자 도구 보면 아래와 같이 되어 있음을 볼 수 있다.
referer: http://www.google.com

=>
이전 웹 사이트 주소를 알려준다.
  • A 에서 B로 이동하는 경우 B를 요청할 때 Referer: A를 포함해서 요청
  • Referer를 사용해서 유입 경로 분석 가능
  • 요청에서 사용
  • 사용 : 주로 유입 경로 or 웹 사이트 분석 시 사용한다.
  • 참고로 referer는 단어 referrer의 오타이다.

## User-Agent

  • 유저 에이전트 애플리케이션 정보
예)
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
  • 클라이언트의 애플리케이션 정보 (웹 브라우저 정보, 등등)
  • 통계 정보
  • 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
  • 요청에서 사용
  • 사용 : 특정 브라우저에서 문제 생길 경우 파악 등

## Server

  • 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
  • Server : Apache/2.2.22 (Debian)
  • server: nginx
  • 응답에서 사용

## Date

  • 메시지가 발생한 날짜와 시간
  • Date : Tue, 15 Nov 1994 08:15:31 GMT
  • 응답에서 사용

 

# 특별한 정보

  • Host : 요청한 호스트 정보(도메인)
  • Location : 페이지 리다이렉션
  • Allow : 허용 가능한  HTTP 메서드
  • Retry-After : 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간

## Host

  • 요청한 호스트 정보 (도메인)
  • 요청에서 사용
  • 필수 헤더이다. (아주 중요)
GET /search?q=hello&hi=ko HTTP/1.1
Host: www.google.com
  • 하나의 서버가 여러 도메인을 처리해야 할 때
  • 하나의 IP 주소에 여러 도메인이 적용되어 있을 때
예)
가상 호스트를 통해 여러 도메인을 한번에 처리할 수 있는 서버, 실제 애플리케이션이 여러개 구동될 수 있다.

여기서 Host가 없으면 발생할 수 있는 문제?
=>
클라이언트가 아래와 같이 요청을 보내면
GET /hello HTTP/1.1 (/hello 요청 전달)

서버에서 /hello가 어디로 들어가야 할지(AAA.com / BBB.com / CCC.com 어디로?)구분할 방법이 없음.
(IP로만 통신하기 때문에)


해결방법) 
Host 사용
GET /hello HTTP/1.1
Host: AAA.com

## Location

  • 페이지 리다이렉션
  • 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동 (리다이렉트)
  • 응답코드 3xx에서 설명
  • 201 (Created) : Location 값은 요청에 의해 생성된 리소스 URI
  • 3xx (Redirection) : Location 값은 요청을 자동으로 리다이렉션하기 위한 대상 리소스를 가리킴

## Allow

  • 허용 가능한 HTTP 메서드
  • 405 (Method Not Allowed)에서 응답에 포함해야 함
  • Allow: GET, HEAD, PUT

## Retry-After

  • 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
  • 503 (Service Unavailable) : 서비스가 언제까지 불능인지 알려줄 수 있다.
  • Retry-After : Fri, 31, Dec 1999 23:59:59 GMT (날짜 표기)
  • Retry-After : 120 (초단위 표기)

 

# 인증 헤더

  • Authorization : 클라이언트 인증 정보를 서버에 전달
  • WWW-Authenticate : 리소스 접근 시 필요한 인증 방법 정의

## Authorization 

  • 클라이언트 인증 정보를 서버에 전달
  • Authorization : Basic xxxxxxx
  • 참고 : 인증마다 value에 들어가는 건 다름

## WWW-Authenticate

  • 리소스 접근시 필요한 인증 방법 정의
  • 401 Unauthorized 응답과 함께 사용
WWW-Authenticate : Newauth Realm="apps", type=1, title="Login to\"apps\"", Basic realm="simple"

 

출처 : 인프런 모든 개발자를 위한 HTTP 웹 기본 지식

반응형

+ Recent posts