HTTP

HunkiKim·2022년 9월 12일
0

HTTP

HTTP란 W3(World Wide Web) 상에서 정보를 주고 받을 수 있는 프로토콜이다. 웹에서 이루어지는 모든 데이터 교환의 기초이며 클라이언트 - 서버 프로토콜이다.

HTTP 특징

  • TCP 기반 프로토콜이다.
    • HTTP는 TCP기반의 프로토콜이기 때문에 TCP가 가지는 모든 특징을 가졌다.
    • 따라서 메시지가 손상되거나 순서가 뒤바뀌어 수신되는 일이 결코 없다.
  • 클라이언트 서버 구조이다.
  • Stateless
    • HTTP는 서버에서 클라이어느의 상태를 저장하지 않음
    • 따라서 이전에 했던 요청에 무관하게 응답함
    • 이러한 특징 덕에 서버가 확장에 용이함
    • 다른 서버와 통신할 필요 없이 현재 클라이언트의 응답에 대한 처리만 하면됨
    • 사용자 상태 정보가 필요할 경우 쿠키와 세션을 활용
  • Connectionless
    • HTTP 통신은 연결을 유지하지 않는 것을 기본 동작으로 가진다.
    • connection을 유지하면 리소르를 사용하는 것이기 때문이다.
    • 그러나 connection을 맺었다가 끊는 것은 많은 비용이 들기 때문에 Keep Alive 옵션을 통해 일정 시간동안 connection을 유지함
  • 간단한 구조
    • HTTP는 사람이 읽을 수 있게 고안됨. (그러나 http2.0부턴 바이너리로 되어있다.)
  • 확장성
    • HTTP 헤더는 클라이언트와 서버가 새로운 헤더의 시맨틱에 대해 합의 한다면 언제든지 기능을 추가할 수 있음.

HTTP 흐름

  1. TCP 연결을 엽니다. TCP 연결은 요청을 보내거나(혹은 여러개의 요청) 응답을 받는데 사용된다. 클라이언트는 새 연결을 열거나, 기존 연결을 재사용하거나, 서버에 대한 여러 TCP 연결을 열 수 있다.
  2. HTTP 메시지를 전송한다. 이는 인간이 읽을 수 있다. HTTP/2에서는 이런 간단한 메시지가 프레임 속으로 캡슐화되어, 직접 읽는게 불가능하지만 원칙가 동일하다.
GET / HTTP / 1.1
Host: hunk.hunf.org
Accept-Language: kr
  1. 서버에 의해 전송된 응답을 읽어들입니다.
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:22:54 GMT
Server: Apach
Last-Modified: Tue, 02 Dec 2005 20:25:10 GMT
ETag: "534bc-2315-435t43"
Accept-Range: bytes
Content-Length: 15342
Content-Length: 29432
Content-Type: text/html
  1. 연결을 닫거나 다른 요청들을 위해 재사용합니다.

HTTP 메시지

  • HTTP 메시지는 시작줄, 헤더, 본문의 줄바꿈 문자열(CRLF)를 기준으로 구분되어 있음
  • 시작줄, 헤더와는 달리 본문은 비어있을 수도 있음

Request

  • 시작줄
    • Method, 요청 url, http 버전으로 구성
    • http의 기본 포트는 80으로 생략되어 있으면 80임
  • 헤더
    • Host, User-Agent, from, cookie등의 데이터가 포함됨
  • 본문
    • GET 메서드는 비어있음, 라고 하는데 사실 현재에는 복잡한 조회가 많기 때문에 URI로 표현할 수 없는 복잡한 조회를 가진 경우엔 Body Entity를 사용할 수도 있다. 실제로 엘라스틱서치나 다양한 앱에서 Get method에 바디를 포함해 조회를 하는 경우가 있다. 하지만 스펙을 위반할 수도 있기 때문에 잘 보고 사용하자.
    • 요청에 필요한 데이터가 포함됨 (파일, 파라미터 등)

Response

  • 시작줄
    • HTTP 버전, 성공 여부와 그 이유를 나타내는 상태코드, 상태 코드의 짧은 설명을 나타내는 상태 메시지로 구성됨
  • 헤더
    • keep-Alive와 같은 커넥션 정보를 나타내는 Conncetion 헤더, Apach같은 서버 종류를 나타낸 Server헤더 등이 포함됨
  • 본문
    • 요청에 대한 데이터를 포함

헤더의 종류

  • General header: 요청과 응답 모두에 적용되지만 바디에서 최종적으로 전송되는 데이터와는 관련이 없는 헤더
  • Requesst header: fetch될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더
  • Response header: 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더
  • Entity header: 컨텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더

General header

  • Date
    • HTTP 메시지를 생성한 일시
    • Date: Sat, 2 Oct 2018 02:00:12 GMT
  • Connection
    • 클라이언트와 서버 간 연결에 대한 옵션 설정(다소 모호)
    • ex) Conncetion : close
      • 현재 HTTP 메시지 직후에 TCP 접속을 끊는다는 것을 알린다.
    • ex) Connection: Keep-Alive
      • 현재 TCP 커넥션을 유지한다.
  • Cache-Contol
    • (쿠키/캐시 관련)
  • Pragma
  • Trailer

Request header

  • Host
    • 요청하는 호스트에 대한 호스트명 및 포트번호 (필수)
      • HTTP/1.1 이후부터 Host 필드는 필수 항목이다.
    • Host 필드에 도메인명 및 호스트명 모두를 포함한 전체 URI(FQDN) 지정이 필요하다.
  • User-Agent
    • 클라이언트 소프트웨어(브라우저, OS) 명칭 및 버전 정보.
  • From
    • 클라이언트 사용자 메일 주소
      • 주로 검색엔진 웹 로봇의 연락처 메일 주소를 나타낸다.
      • 때로는, 이 연락처 메일 주소를 User-Agent 항목에 두는 경우도 있다.
  • Cookie
    • 서버에 의해 Set-Cookie로 클라이언트에게 설정된 쿠키 정보
    • (쿠키/캐시 관련)
  • Referer
    • 바로 직전에 머물렀던 웹 링크 주소
  • If-Modified-Since
    • 제시한 일시 이후로만 변경된 리소스를 취득 요청
  • Authorization
    • 인증 토큰(JWT/Bearer 토큰)을 서버로 보낼 때 사용하는 헤더
    • "토큰의 종류(Basic, Bearer 등) + 실제 토큰 문자"를 전송
  • Origin
    • 서버로 POST 요청을 보낼 때, 요청이 어느 주소에서 시작되었는지 나타낸다.
    • 여기서 요청을 보낸 주소와 받는 주소가 다르면 CORS 에러가 발생한다.
    • 응답 헤더의 Access-Control-Allow-Origin와 관련
  • 다음 4개는 주로 HTTP 메시지 Body의 속성 또는 애용 협상용 항목들
    • Accept
      • 클라이언트 자신이 원하는 미디어 타입 및 우선순위를 알린다.
        • 텍스트(text/html,text/plain,...), 이미지(image/jpeg,...)등
      • ex) Accept: /
        • 어떤 미디어 타입도 가능하다.
      • ex) Accept: image/*
        • 모든 이미지 유형이 가능하다.
    • Accpet-Charset
      • 클라이언트 자신이 원하는 문자 집합
    • Accept-Encoding
      • 클라이언트 자신이 원하는 문자 인코딩 방식
    • Accept-Language
      • 클라이언트 자신이 원하는 가능한 언어
    • 각각의 HTTP Entity Header 항목 중에 Content-Type, Content-Type charset-xxx, Content-Encoding, Content-Language과 일대일로 대응된다.

Response Header

  • Server
    • 서버 소프트웨어 정보
  • Accept-Range
  • Set-Cookie
    • 서버측에서 클라이언트에게 세션 쿠키 정보를 설정
    • (쿠키/캐시 관련)
  • Expires
    • 리소스가 지정된 일시까지 캐시로써 유효함을 나타낸다. 즉, 응답 컨텐츠가 언제 만료되는지를 나타낸다.
    • ex) Expires: Thu, 26 Jul 2018 07:23:12 GMT
    • Cache-Control과 별개로 응답에 Expires라는 헤더를 줄 수 있다.
      • 단, Cache-Control의 max-age가 있는 경우 이 헤더는 무시
    • (쿠키/캐시 관련)
  • Age
    • 캐시 응답. max-age 시간 내에서 얼마나 흘렀는지 초 단위로 알려준다.
    • (쿠키/캐시 관련)
  • ETag
    • HTTP 컨텐츠가 바뀌었는지를 검사할 수 있는 태그
    • (쿠키/캐시 관련)
  • Proxy-authenticate
  • Allow
    • 해당 엔터티에 대해 서버 측에서 지원 가능한 HTTP 메소드의 리스트를 나타낸다.
    • 때론, HTTP 요청 메시지의 HTTP 메소드 OPTIONS에 대한 응답용 항목으로 사용된다.
      • OPTIONS: 웹 서버측 제공 HTTP 메소드에 대한 질의
    • Ex) Allow: GET, HEAD
      • 405 Method Not Allowed 에러와 함께
      • 웹 서버에서 제공 가능한 HTTP 메서드는 GET, HEAD 뿐임을 알린다.
  • Access-Control-Allow-Origin
    • 요청을 보내는 프론트 주소와 받는 백엔드 주소가 다르면 CORS(Cross Origin Resource Sharing) 에러가 발생
      • 서버에서 이 헤더에 프론트 주소를 적어주어야 에러가 나지 않는다.
    • ex) Access-Control-Allow-Origin: www.abc.dfg
      • 프로토콜, 서브도메인, 도메인, 포트 중 하나만 달라도 CORS 에러가 난다.
    • ex) Access-Control-Allow-Origin: *
      • 만약 주소를 일일이 지정하기 싫다면 *으로 모든 주소에 CORS 요청을 허용되지만 그만큼 보안이 취약해진다.
    • 유사한 헤더로 Access-Control-Request-Method, Access-Control-Request-Headers, Access-Control-Allow-Methods, Access-Control-Allow-Headers등이 있다.
    • Request와 Allow에서 Method 단수 복수 주의

Entity header

HTTP 헤더 내 엔터티 / 개체 헤더 항목

  • Content-Type
    • 해당 개체에 포함되는 미디어 타입 정보
    • 컨텐츠의 타입(MIME 미디어 타입) 및 문자 인코딩 방식(EUC-KR, UTF-8등)을 지정한다.
    • 타입 및 서브타입(type/subtype)으로 구성된다.
      • 타입(type): 10개 정도 표준으로 지정됨(application, audio, font, image, multipart 등)
      • 서브타입(subtype): 각 타입별로 수십에서 수백개 정도
    • ex) Content-Type: text/html; charset-latin-1
      • 해당 개체가 html 텍스트 문서이고, iso-latin-1 문자 인코딩 방식으로 표현되는 것을 의미한다.
    • (공통 헤더)
  • Content-Language
    • 해당 개체와 가장 잘 어울리는 사용자 언어(자연 언어)
    • (공통 헤더)
  • Content-Encoding
    • 해당 개체 데이터의 압축 방식
    • ex) Content-Encoding: gzip, deflate
    • 만일 압축이 시행되었다면 Content-Encoding 및 Content-Length 2개 항목을 토대로 압축 해제가 가능하다.
    • (공통 헤더)
  • Content-Length
    • 전달되는 해당 개체의 바이트 길이 또는 크기(10진수)
    • 응답 메시지 Body의 길이를 지정하거나 특정 지정된 개체의 길이를 지정한다.
    • (공통 헤더)
  • Content-Location
    • 해당 개체의 실제 위치를 알려준다.
    • (공통 헤더)
  • Content-Disposition
    • 응답 Body를 브라우저가 어떻게 표시해야할지 알려준다.
    • inline인 경우 웹페이지 화면에 표시되고, attachment인 경우 다운로드 한다.
      • ex) Content-Disposition: inline
      • ex) Content-Dispostion: attachment; filename='filename.csv'
    • 다운로드되길 원하는 파일은 attachment로 값을 설정하고, filename 옵션으로 파일명까지 지정해줄 수 있다.
    • 파일용 서버인 경우 이 태그를 자주 사용한다.
    • (응답 헤더)
  • Content-Security-Policy
    • 다른 외부 파일들을 불러오는 경우, 차단할 소스와 불러올 소스를 명시한다.
    • XSS 공격에 대한 방어 기능 (허용한 외부 소스만 지정 가능)
    • ex) Content-Security-Policy: default-src https:
      • https를 통해서만 파일을 가져온다.
    • ex) Content-Security-Policy: default-src 'self'
      • 자신의 도메인의 파일들만 가져온다.
    • ex) Content-Security-Policy: default-src 'none'
      • 파일을 가져올 수 없다.
    • (응답 헤더)
  • Location
    • 리소스가 리다이렉트(redirect)된 때에 이동된 주소, 또는 새로 생성된 리소스 주소를 명시한다.
    • 300번대 응답이나 201Created 응답일 때 어느 페이지로 이동할지를 알려준다.
      • 새로 생성된 리소스의 경우
        • HTTP 생성 코드 201 Created가 반환된다.
      • 300번대 응답의 경우
        • HTTP/1.1 302 Found Location: /
        • 이런 응답이 왔다면 브라우저는 /주소로 redirect한다.
    • (응답 헤더)
  • Last-Modified
    • 리소스를 마지막으로 갱신한 일시
    • (응답 헤더)
  • Transfer-Encoding
    • chunked
    • 동적으로 생성되어 Body의 길이를 모르는 경우에 조금씩 전송 가능하다.
    • 각 chunk마다 그 시작에 16진수 길이를 삽입하여 chunk 길이를 알려준다.
    • (응답 헤더)

캐시 관련 Header

  • 캐시와 관련된 헤더들, 보통 GET 요청에만 포함됨
  • 응답과 요청 헤더 둘 다 포함 가능
  • Cache-Control
    • ex) Cache-Control: no-store
      • 아무것도 캐싱하지 않는다.
    • ex) Cache-Control: no-cache
      • 모든 캐시를 쓰기 전 서버에 해당 캐시를 사용해도 되는지 확인한다. (유효성 검사)
    • ex) Cache-Control: must-revalidate
      • 만료된 캐시만 서버에 확인을 받도록 한다.
    • ex) Cache-Control: public
      • 공유 캐시(또는 중개 서버)에 저장해도 된다는 것을 의미한다.
    • ex) Cache-Control: private
      • 브라우저같은 특정 사용자 환경에만 저장한다.
    • ex) Cache-Control: max-age
      • 캐시 유효시간을 명시한다.
    • 주로 응답 헤더로 사용하지만, "클라이언트-중개 서버- 서버"의 구조에서 중개 서버의 캐시를 가져오지 않도록 하려면 클라이언트에서 요청 헤더에 이 헤더를 추가한다.
    • (공통 헤더)
  • Expires
    • 리소스가 지정된 일시까지 캐시로써 유효함을 나타낸다. 즉, 응답 컨텐츠가 언제 만료되는지를 나타낸다.
    • Ex) Expires: Thu, 26 Jul 2018 07:28:00 GMT
    • Cache-Control과 별개로 응답에 Expires라는 헤더를 줄 수 있다.
      • 단 Cache-Control의 max-age가 있는 경우 이 헤더는 무시
    • (응답 헤더)
  • Age
    • 캐시 응답. max-age 시간 내에서 얼마나 흘렀는지 초 단위로 알려준다.
    • ex) max-age=3600설정시, 1분 후 Age: 60이 캐시 응답 헤더에 포함된다.
    • (응답 헤더)
  • ETag
    • HTTP 컨텐츠가 바뀌었는지를 검사할 수 있는 태그
    • 같은 주소의 자원이더라도 컨텐츠가 달라졌더라면 ETag가 다르다.
    • 같은 주소로 GET 메서드 수행 시 응답 Body의 내용이 동일하면 같은 ETag를 갖지만, 내용이 바뀌었다면 ETag 헤더 값이 변경된다.
    • 이 헤더 값이 변경되었다면 캐시를 지우고 새로 변경된 컨텐츠를 받는다.
    • (응답 헤더)
  • If-None-match
    • 서버에 ETag가 달라졌는지 검사를 요청한다.
    • ETag가 다를 경우에만 컨텐츠를 새로 받는다.
    • 만약 ETag가 같다면 서버는 304 Not Modified를 응답해서 캐시를 그대로 사용한다.
    • (요청 헤더)

Cookies 관련 헤더

  • Cookie
    • 서버에 의해 Set-Cookie로 클라이언트에게 설정된 쿠키 정보
    • ex) Cookie: attribute1=value1; attribute2=value2;
    • 서버는 이 쿠키 헤더를 파싱해서 사용한다.
    • CSRF 공격같은 것을 막기 위해서 반드시 서버는 쿠키가 제대로 된 상황에서 온 것인지 확인하는 로직이 필요하다.
    • (요청 헤더)
  • Set-Cookie
    • 서버측에서 클라이언트에게 세션 쿠키 정보를 설정할 때 사용하는 항목
    • ex) Set-Cookie: 속성이름(attribute)=속성값(value); 옵션들 형태로 다수 정보들이 설정됨
    • 옵션들
      • Expires
        • 쿠키 만료 날짜 설정
      • Max-Age
        • 쿠키 수명 설정, Expires는 무시
      • Secure
        • https에서만 쿠키가 전송된다
      • HttpOnly
        • 자바스크립트에서 쿠키에 접근할 수 없다.
        • XSS 요청을 막으려면 활성화해두는 것이 좋다.
      • Domain
        • 도메인을 적어주면 도메인이 일치하는 요청에서만 쿠키가 전송된다.
        • 가끔 도메인이 다른 쿠키들이 있는데, 이런 쿠키들은 써드 파티 쿠키로 클라이언트를 추적하고 있는 쿠키다.
      • Path
        • 해당 path와 일치하는 요청에서만 쿠키가 전송된다.
    • ex) Set-Cookie: zerocho=babo; Expires=Wed, 21 Oct 2015 07:25:00 GMT; Secure; HttpOnly
      • 쿠키는 XSS공격과 CSRF 공격 등에 취약하기 때문에 HttpOnly 옵션을 켜두고, 쿠키를 사용하는 요청은 서버 단에서 검증하는 로직을 마련해두는 것이 좋다.
    • (응답 헤더)

상태 코드 종류

  • 1xx 조건부 응답
  • 2xx 성공
  • 3xx 리다이렉션 완료
  • 4xx 요청 오류 (클라이언트 측 에러)
  • 5xx 서버 에러

1xx 조건부 응답

  • 100 Continue : 이 임시적인 응답은 지금까지의 상태가 괜찮으며 클라이언트가 계속해서 요청을 하거나 이미 요청을 완료한 경우에는 무시해도 되는 것을 알려준다.
  • 101 Switching Protocol : 이 코드는 클라이언트가 보낸 Upgrade (en-US) 요청 헤더에 대한 응답에 들어가며 서버에서 프로토콜을 변경할 것임을 알려준다.
  • 102 Processing (WebDAV (en-US)) : 이 코드는 서버가 요청을 수신하였으며 이를 처리하고 있자만, 아직 제대로 된 응답을 알려줄 수 없음을 알려준다.

2xx 성공

  • 200(성공) : 서버가 요청을 제대로 처리했다는 뜻이다. 이는 주로 서버가 요청한 페이지를 제공했다는 의미로 쓰인다.
  • 201(작성됨) : 성공적으로 요청되었으며 서버가 새 리소스를 작성했다.
  • 202(허용됨) : 서버가 요청을 접수했지만 아직 처리하지 않았다.
  • 203(신뢰할 수 없는 정보) : 서버가 요청을 성공적으로 처리했지만 다른 소스에서 수신된 정보를 제공하고 있다.
  • 204(콘텐츠 없음): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않는다.
  • 205(콘텐츠 재설정) : 서버가 요청을 성공적으로 처리했지만 콘텐츠를 표시하지 않는다. 204 응답과 달리 이 응답은 요청자가 문서 보기를 재설정할 것을 요구한다.(예: 새 입력을 위한 양식 비우기).
  • 206(일부 콘텐츠) : 서버가 GET 요청의 일부만 성공적으로 처리했다.

3xx 리다이렉션 완료

  • 300(여러 선택항목) : 서버가 요청에 따라 여로 조치를 선택할 수 있다. 서버가 사용자 에이전트에 따라 수행할 작업을 선택하거나, 요청자가 선택할 수 있는 작업 목록을 제공한다.
  • 301(영구 이동) : 요청한 페이지를 새 위치로 영구적으로 이동했다. GET 또는 HEAD 요청에 대한 응답으로 이 응답을 표시하면 요청자가 자동으로 새 위치로 전달된다.
  • 302(임시 이동) : 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.
  • 303(기타 위치 보기) : 요청자가 다른 위치에 별도의 GET 요청을 하여 응답을 검색할 경우 서버는 이 코드를 표시한다. HEAD 요청 이외의 모든 요청을 다른 위치로 자동으로 전달한다.
  • 304(수정되지 않음) : 마지막 요청 이후 요청한 페이지는 수정되지 않았다. 서버가 이 응답을 표시하면 페이지의 콘텐츠를 표시하지 않는다. 요청자가 마지막으로 페이지를 요청한 후 페이지가 변경되지 않으면 이 응답(If-Modified-Since HTTP 헤더라고함_을 표시하도록 서버를 구성해야 한다.
  • 305(프록시 사용): 요청자는 프록시를 사용하여 요청한 페이지만 엑세스 할 수 있다. 서버가 이 응답을 표시하면 요청자가 사용할 프록시를 가리키는 것이기도 하다.
  • 307(임시 리다이렉션) : 현재 서버가 다른 위치의 페이지로 요청에 응답하고 있지만 요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다.
  • 308(영구 리다이렉션, RFC에서 실험적으로 승인됨)

4xx요청 오류(클라이언트 측 에러)

  • 400(잘못된 요청) : 서버가 요청의 구문을 인식하지 못했다.
  • 401(권한 없음) : 이 요청은 인증이 필요하다. 서버는 로그인이 필요한 페이지에 대해 이 요청을 제공할 수 있따. 상태 코드 이름이 권한 없음(Unauthorized)으로 되어 있지만 실제 뜻은 인증 안됨(Unauthenticated)에 더 가깝다.
  • 402(결제 필요) : 이 요청은 결제가 필요합니다.
  • 403(Forbidden, 금지됨) : 서버가 요청을 거부하고 있다. 예를 들자면, 사용자가 리소스에 대한권한을 갖고 있지 않다. (401은 인증 실패, 403은 인가 실패라고 볼 수 있다.)
  • 404(Not Found, 찾을 수 없음) : 서버가 요청한 페이지(Resource)를 찾을 수 없다. 예를 들어 서버에 존재 하지 않는 페이지에 대한 요청이 있을 경우 서버는 이 코드를 제공한다.
  • ETC..

5xx 서버 오류

  • 500(내부 서버 오류) : 서버에 오류가 발생하여 요청을 수행할 수 없다.
  • 501(구현되지 않음) : 서버에 요청을 수행할 수 있는 기능이 없다. 예를 들어 서버가 요청 메서드를 인식하지 못할 때 이 코드를 표시한다.
  • 502 (Bad Gateway, 불량 게이트웨이) : 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 잘못된 응답을 받았다.
  • 503(서비스를 사용할 수 없음) : 서버가 오버로드 되었거나 유지관리를 위해 다운되었기 때문에 현재 서버 사용 불가능하다. 보통 일시적인 상태이다.
  • 504(게이트웨이 시간 초과) : 서버가 게이트웨이나 프록시역할을 하고 있거나 또는 업스트림 서버에서 제때 요청을 받지 못했다.
  • 505(HTTP 버전이 지원되지 않음) : 서버가 요청에 사용된 HTTP 프로토콜 버전을 지원하지 않는다.
  • ETC..

0개의 댓글