본문 바로가기
JAVA & SPRING/HTTP 웹 기본 지식

HTTP 웹 기본 지식 - 6일차(HTTP 헤더1 - 일반 헤더)

by 눈오는1월 2023. 8. 25.
728x90

HTTP 헤더

HTTP 헤더에는 HTTP 전송에 필요한 모든 부가정보가 다 들어가 있다.

헤더의 정보로는

  • General 헤더
  • Request 헤더
  • Response 헤더
  • Entity 헤더

이렇게 존재한다.

 

과거에 엔티티 정보들이 현재에는 표현 정보를 사용한다.

표현 = 표현 메타데이터 + 표현 데이터로 이루어진 것을 말한다.

표현헤더에 4가지 정보들이 들어갈 수 있다.

Content-Type : 표현 데이터의 형식

Content-Encoding : 표현 데이터의 압축 방식

Content-Language: 표현 데이터의 자연 언어

Content-Length: 표현 데이터의 길이

 

표현 헤더는 request, response 둘 다 사용 가능하다.

 

Content-Type에는 본문에 보내는 값이 이미지인지, html 인지 json인지 알려주는 정보를 가진다.

Content-Encoding에는 해당 데이터를 어떻게 인코딩했는지에 관한 정보를 가지고 있다. -> 해당 정보를 확인해서 인코딩한 방식으로 압축된 데이터를 확인한다.

Content_Language는 데이터의 자연 언어가 무엇인지에 대한 정보를 가진다.

Content-Length에는  표현 데이터의 길이에 관한 정보를 가진다. -> Transfer-Encoding을 사용할 때는 Content-Length를 사용하면 안 된다(바디에 표현 데이터 길이의 정보를 가지고 있기 때문)

 

또 협상(콘텐츠 네고시에이션)이라는 개념이 존재한다.

해당 개념은 클라이언트 때에만 사용이 가능하고 말 그대로 클라이언트가 원하는 표현데이터를 만들어야 한다.

Accept: 클라이언트가 선호하는 미디어 타입 전달

Accept-Charset: 클라이언트가 선호하는 문자 인코딩

Accept-Encoding: 클라이언트가 선호하는 압축 인코딩

Accept-Language: 클라이언트가 선호하는 자연 언어

 

예를 들어서 클라이언트와 서버가 통신을 한다고 가정하자 

한국 브라우저에서 서버로 요청을 했을 때 Accept-Language가 적용되지 않으면 서버에 지원되는 언어 순위에 맞게끔 응답이 간다. 

(만약 서버에 1순위가 영어, 2순위가 한국어 이면 1순위로 응답함)

Accpet-Language를 통해 한국어가 우선순위로 되어있으면 이 적용에 맞게끔 한국어로 응답이 간다.

좀 더 복잡한 방식을 예로 하나 더 들자면

마찬가지로 한국 브라우저에서 서버로 요청했을 때 서버에 1. 독일어 2. 영어라고 가정했을 때 한국어가 없어서 한국어로 보내지 못해서 브라우저에서는 차라리 영어로 왔으면 좋겠다는 생각을 가지겠지만 Accept-Language가 없으면 1번인 독일어로 응답을 받게 된다.

Accept-Language가 있으면 우선순위가 존재하므로 만약 영어가 독일어보다 우선순위가 높다면 영어로 응답을 하게 된다.

위 사진처럼 Quality Values(q)를 이용해서 응답순위를 설정할 수 있다.

1은 생략 가능하고 0 ~ 1로 지정한다. 1에 가까울수록 응답순위가 높은 것이다.

 

또 이러한 우선순위는 구체적인 것이 더 우선시된다.

 

HTTP 전송 방식

HTTP 전송 방식에는 4가지 전송 방식이 있다.

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

단순 전송(Content-Length)은 일반적으로 전송했을 때를 의미한다.

압축 전송(Content-Encoding)은 인코딩이나 다른 방식을 통해 압축해서 보내는 것을 의미한다.

분할 전송(Transfer-Encoding)은 값을 분할해서 전송한다.

 

이런 식으로 값을 전송하기에 HTTP 헤더에 보면 Transfer-Encoding이 chunked로 되어있다. 

범위 전송(Content-Range)은 범위를 지정해서 전송한다.

 

정보

정보에는 일반정보와 특별한 정보가 있다.

일반 정보에는

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

가 존재한다.

From은 일반적으로 잘 사용되지 않고 검색엔진에서 주로 사용된다. 주로 (요청에서 사용)

 

Referer에는 현재 요청된 페이지의 이전 웹 페이지 주소가 담겨 있다 예를 들어 구글에서 Spring을 검색한 후에 나무위키에 들어가면 Referer에는 그전 웹 페이지 인 구글 주소가 담겨 있다. Referer을 통해 유입 경로 분석이 가능하다. (요청에서 사용)

(참고로 Referer은 referrer의 오타이다. 이미 많은 사람들이 referer을 사용하고 있어서 고치면 문제가 되기 때문에 이 상태로 뒀다고 한다.)

 

User-Agent는 유저 에이전트의 애플리케이션 정보가 있다. 이를 통해서 통계 정보나 에러가 났을 때, 어떤 종류의 브라우저에서 장애가 발생하는지 파악이 가능하다.(요청에서 사용)

 

Server에는 요청을 처리하는 서버의 소프트웨어 정보가 담겨 있다 R서버에서 클라이언트로 바로 보내지는 게 아닌 사실 프록시 서버를 통해 전달되므로 여기서 말하는 서버는 진짜 보내는 서버(origin 서버)가 있다. (응답에서 사용)

 

Date는 메시지가 발생한 날짜와 시간이 담겨있다(응답에서 사용)

 

특별한 정보에는

  • Host
  • Location
  • Allow
  • Retry-After

가 있다.

 

Host

Host는 다른 정보와 다르게 필수로 사용되어야 하는 정보이다. 아이피로 통신을 할 때 아이피만 알고 있으면 서버 내에 어느 도메인으로 가야 하는지 모르는데 HOST정보가 이걸 해결해 준다(요청에서 사용)

 

Location

Location은 페이지 리다이렉션 때 사용된다 응답코드 3xx 결과에 Location이 있으면 해당 위치로 자동으로 이동한다.

 

Allow

Allow는 허용 가능한 HTTP 메서드를 말한다. 만약 POST로 보냈는데 405 응답이 오고 Allow에 GET, HEAD, PUT이 있을 경우 위 Allow에 있는 메서드로 값을 보내야 한다.

 

Retry-After

유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간이 담겨 있다. 503 응답과 함께 정보 제공됨

 

인증

간단하게만 하고 넘어간다

Authorization : 클라이언트 인증 정보를 서버에 전달

www-Authenticate : 리소스 접근 시 필요한 인증 방법 정의

 

쿠키

Set-Cookie: 서버가 클라이언트로 쿠키 전달(응답)

Cookie: 클라이언트가 서버로 받은 쿠키를 저장하고 HTTP 요청 시 서버로 전달

 

쿠키는 주로 로그인에 사용된다.

쿠키가 없이 로그인하는 과정을 생각해 보면 HTTP는 무상태 프로토콜이다 그래서 클라이언트와 서버가 요청과 응답을 주고받으면 연결이 끊어지고 서버는 클라이언트의 이전 요청을 기억하지 못한다. 그래서 만약 로그인을 하고 나서 다른 메서드로 요청은 보낼 때 클라이언트는 서버에게 로그인 한 값들을 계속 보내야 한다.

위와 같은 전달 방식을 이용하면 보안에도 굉장히 치명적이다.

쿠키를 사용하면 아래와 같은 방식으로 진행된다.

쿠키 정보는 서버로 전송되기에 최소한의 정보만 사용한다 -> 네트워크 트래픽이 추가로 유발되기 때문

쿠키의 생명주기로는  세션 쿠키, 영속 쿠키가 있다.

세션쿠키는 만료 날짜를 생략했을 때 브라우저 종료 시까지만 유지되고 영속 쿠키는 만료 날짜를 입력하면 해당 날짜까지 유지한다.

쿠키는 도메인을 지정해서 해당 도메인에서만 쿠키가 접근할 수 있게 할 수 있다 생략했을 시에는 생성한 도메인에만 쿠키가 접근이 가능하다.

또한 쿠키에는 경로를 지정할 수 있다. 경로를 지정했을 때 해당 경로를 포함한 하위경로 페이지만 쿠키 접근이 가능하다.

마지막으로 쿠키에 보안을 지정할 수 있다.

  • Secure
  • HttpOnly
  • SameSite

가 있다.

Secure 적용 시 https인 경우에만 전송 가능하다

HttpOnly 적용 시 Xss 공격을 방지한다 -> 자바스크립트에서 접근이 불가하고 HTTP 전송에만 사용됨

SameSite 적용 시 XSRF 공격 방지 -> 요청 도메인과 쿠키에 설정된 도메인이 같은 경우에만 쿠키가 전송됨

 

 

 

728x90