HTTP 겉햝기

timothy jeong·2021년 8월 10일
0

네트워크

목록 보기
2/2
post-thumbnail

HTTP 란?

HTTP는 Hyper Text Transfer Protocol 로 html 등의 문서를 전달하기위한 프로토콜로서 개발되었으나, 근래에는 거의 모든 것들을 전달하는 프로토콜로 사용된다.

  • HTML, TEXT
  • IMAGE, 음성, 영상, 파일
  • JSON, XML (API)
  • 서버간 통신

이러한 HTTP 가 통신할때 오고가는 내용을 HTTP 메시지라고 하며, 이러한 HTTP 메시지는 TCP/IP를 기반으로 전달된다.

HTTP 의 특징

  • 무상태성
    서버가 클라이언트의 상태를 보존하지 않는다. 즉, 서버는 클라이언트와 직전에 통신했던 내용을 알지 못한다.

  • 비연결성
    요청과 응답이 오고간 다음에 네트워크 연결을 끊는다.
    장점 : 네트워크 연결을 유지하기 위해서 서버 자원을 사용할 필요가 없다.
    단점 : 요청이 올때마다 TCP/IP 의 3 way handshake 를 해야하는 번거로움이 있다.

  • 비연결성 극복
    HTTP는 비연결성이라는 특징에 따른 단점을 극복하고자 지속연결 (Persistent Connections) 이라는 것을 이용해서 문제를 해결했다.

HTTP 메시지 구조

http 메시지는 start line, header, empty line ,body로 나뉜다. 이때 요청 메시지인지 응답 메시지에 따라서 그 내용물이 달라질 수 있다.

start line(request line)

start line은 세부분으로 구성되어진다.

  • HTTP 메서드
    GET, POST, PUT, DELETE, HEAD, OPTIONS 를 이용해 서버가 할 동작을 명시함.

  • 요청타겟포맷
    요청컨텍스트에 의해 URL, 프로토콜, 포트, 도메인 절대 경로 등이 나타남.

  • HTTP 버전

start line(status line)

start line은 세부분으로 구성되어진다.

  • HTTP 버전
  • HTTP 상태코드
  • 문구

HTTP 헤더는 헤더필드 이름: 헤더필드 값 의 형태를 가지며, 헤더필드 종류에 따라 헤더필드 값이 달라진다.

header의 용도는 HTTP 전송에 필요한 모든 부가정보가 들어있다. 메타데이터라고 생각하면 된다.

표준 헤더필드 외에 임의의 헤더 필드를 추가할 수 있다.

헤더는 일반헤더, 표현헤더, 협상헤더, 인증헤더, 검증 헤더&조건부 요청 헤더로 나눌 수 있다. (RFC7230)

message body

바이트로 표현할 수 있는 모든 데이터가 전송이 된다.
HTML, 이미지, 영상, JSON 등등

이러한 message body를 메시지 본문, 페이로드(payload), 표현데이터 라고 부른다.

header field

일반헤더

  • From: 유저에이전트의 이메일 정보(요청)

  • Referer: 현재 요청된 페이지의 이전 웹 페이지 주소(요청)

  • user-agent: 클라이언트의 애플리케이션 정보(요청)

  • Server: 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보(응답)

  • Date: 메시지가 발생한 날짜와 시간(응답)

  • Allow: 허용 가능한 HTTP 메서드

  • Host: 요청한 호스트(도메인) 정보(요청)
    하나의 서버에 여러 어플리케이션이 다른 도메인으로 구동되고 있는 경우, 들어오는 요청을 구분하기 위한 값

  • Location: 페이지 리다이랙션
    웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동(리다이랙트)

  • Retry-After: 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
    503(Service Unavailalbe)일때 서비스가 언제까지 불능인지 알려줄 수 있음

표현헤더

  • Content-type: 표현데이터의 형식(text/html, Application/josn, image/png)
  • Content-Encoding: 표현데이터의 압축 방식
  • Content-Langueage: 표현데이터의 자연 언어
  • Content-Length: 표현데이터의 길이

표현 헤더는 요청, 응답 모두 사용할 수 있다.

협상헤더

  • Accept: 클라이언트가 선호하는 미디어 타입 전달
  • Accept-Charset: 클라이언트가 선호하는 문자 인코딩
  • Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
  • Accept-Language: 클라이언트가 선호하는 자연 언어

협상 헤더는 요청시에만 사용하는 헤더이다.

협상 우선순위

이러한 협상 헤더는 우선순위를 줄 수 있는데,

Qualtity Values(줄여서 q라고 표기)를 이용하여 우선순위를 줄 수 있으며 q값이 낮을수록 선호도가 낮은 것이다.

Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en=0.7;
이러한 헤더에서 우선순위는
1. ko-KR
2. ko
3. en-US
4. en

q로 우선순위를 주지 않을 경우 구체적으로 명시된 선호타입이 더 선호되는 것으로 해석한다.

Accept: text/*, text/plain, text/plain;format=flowed, */*
이러한 헤더에서 우선순위는
1. text/plain;format=flowed
2. text/plain
3. text/
4.
/*

인증 헤더

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

검증 헤더 & 조건부 요청 헤더

검증헤더

캐시 데이터와 서버 데이터가 같은지 검증하도록 하는 헤더

  • Last-modified: datetime(UTC) 캐시 데이터의 최신 변경일자

  • ETag: 임의의값
    캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
    데이터가 변경되면 ETag 이름을 변경함

조건부 요청 헤더

  • if-modified-since: datatime(UTC)
    Last-modified 헤더가 있는 응답으로 캐시가 설정되었다면, 데이터 갱신 메시지에 if-modified-since 헤더가 포함되어서 전달된다. 서버에서는 해당 헤더의 정보와 데이터의 수정일자를 비교하여 변경사항이 없다면 start-line에 Not Modified라고 쓰고, HTTP Body가 없는 상태로 온다.
    BUT! 1초 미만단위로는 캐시 조정이 불가능 + 데이터 내용은 변경되지 않았으나, 수정일자만 바뀐경우도 데이터가 바뀐걸로 인식한다.

  • if-None-Match: ETag(임의의값)
    서버에서 ETag 값이랑 일치하는지 확인하여 일치하면 304 Not Modified

캐시 제어 헤더

  • cache-Control: max-age=60 // 캐시 유효시간(초단위)

  • cache-Control: no-cache // 데이터는 캐시해도 되지만, 항상 서버에서 검증하고 사용하도록 함

  • cache-Control: no-store // 데이터에 민감한 정보가 있으므로 저장하지 않도록함, 보통 캐시는 하드에 저장을 하는데 메모리에만 저장하도록 함

  • cache-Control: public // 응답이 public 캐시(프록시 캐시)에 저장되어도 됨

  • cache-Control: private // 응답이 해당 클라이언트에만 저장되어야함.(기본값)

  • cache-Control: s-maxage // public 캐시에만 적용되는 max-age

  • cache-Control: no-cache, no-store, must-revalidate // 무슨 일이 있어도 절대로 캐시로 저장하면 안되는 데이터라고 명시하는것

더 알아볼 내용

HTTP 비연결성에 따른 단점을 극복하기 위해 지속연결이라는 것을 적용했다고 한다. 그러면 비연결성에 의한 장점도 잃어버리는게 아닌가?

profile
개발자

0개의 댓글