HTTP & HTTPS

이재홍·2022년 4월 13일
0

HTTP(HyperText Transfer Protocol)

HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜(통신규약)입니다.
클라이언트-서버 모델을 따르는 프로토콜로 TCP/IP 위에서 동작하며 well-known 포트인 80번 포트를 사용하여 통신한다. 첫번째 표준은 HTTP/1.1이며 이후로 HTTP/2 및 HTTP/3가 등장하였다.

특징

비-연결 지향 (Connectionless)

클라이언트가 서버에게 리소스를 요청한 후 응답을 받으면 연결을 끊어버리는 특징이다. 연결을 유지하게 되면 서버에 많은 부담을 줄 수 있기 때문에 상당히 많은 클라이언트에게 요청을 받는 웹 서버의 경우 응답을 처리했으면 연결을 끊는다. 이로 인해 서버의 부담을 줄일 수 있지만, 리소스를 요청할 때마다 연결해야 하는 오버헤드 비용이 발생한다. 이를 해결하기 위해선, 요청 헤더의 Connection: keep-alive 속성으로 지속적 연결 상태(Persistent connection)를 유지할 수 있다. 즉, 요청을 할 때마다 연결하지 않고 기존의 연결을 재사용하는 방식이다. HTTP 1.1 부턴 지속적 연결 상태가 기본이며 이를 해제하기 위해선 명시적으로 요청 헤더를 수정해야 한다.

무상태성 (Stateless)

각각의 요청이 독립적으로 여겨지는 특징으로, 서버는 클라이언트의 상태를 유지하지 않는다. 즉, 각 클라이언트에 맞게 리소스를 응답하는 것은 불가능하다. 이를 해결하기 위해, 쿠키나 세션 또는 토큰 방식의 OAuth 및 JWT가 사용된다.

Method

클라이언트가 서버에 요청방법을 정의하는 것으로 주어진 리소스에 수행하길 원하는 행동을 나타낸다.

  • GET : 서버에게 조회할 리소스를 요청한다. (READ, 조회) - 쿼리스트링으로 데이터전송
  • POST : 서버에게 본문(body)에 생성할 데이터를 삽입하여 전송한다. (CREATE, 생성)
  • PUT : 서버에게 본문에 수정할 데이터를 삽입하여 전송한다. (UPDATE, 수정)
  • DELETE : 서버에게 삭제할 리소스를 요청한다. (DELETE, 삭제)
  • PATCH : PUT과 비슷하지만 일부만 수정한다는 점에서 다르다.

응답 상태코드

서버가 클라이언트에게 요청을 받으면 응답상태에 따라서 다른 상태코드를 클라이언트에게 돌려준다.

  • 1xx (정보 확인) : 요청의 일부를 받았으며 나머지 요청을 더 기다리는중
    • 101(프로토콜 전환 승인)
  • 2xx (성공) : 요청을 성공적으로 수행했다.
    • 200(요청 성공-GET)
    • 201(생성 성공-POST)
    • 202(요청 접수, 아직 처리는 안함)
    • 204(요청은 성공, 응답할 컨텐츠X)
    • 206(스트리밍처럼 응답으로 일부만 먼저 전송됨)
  • 3xx (리다이렉션) : 클라이언트가 요청을 마지기 위해 추가적인 동작을 취해야 한다.
    • 300(여러개의 응답, 선택해야 함)
    • 301(영구이동, 요청한 페이지가 영구적으로 이동됨)
    • 302(임시이동, 대부분의 리다이렉트)
  • 4xx (클라이언트 오류) : 클라이언트에 오류가 있다.
    • 400(API에 맞지않는 요청) - Bad Request
    • 401(권한 없음, 인증오류) - Unauthorized
    • 403(금지된 페이지, 리소스에 대한 권한 없음) - Forbidden
    • 404(찾을 수 없음, 서버에 없는 페이지) - Not Found
    • 405(API에 정의되지않은 메소드) Method Not Allowed
    • 408(요청시간 초과) - Request Timeout
    • 409(충돌오류) - Conflict
  • 5xx (서버 오류) : 서버에 오류가 있다.
    • 500(내부 서버오류) - Internal Server Error
    • 502(게이트웨이 오류, 요청 유실) - Bad Gateway
    • 503(서비스 사용불가) - Service Unavailable
    • 504(시간 초과) - Gateway Timeout

상태코드
https://developer.mozilla.org/ko/docs/Web/HTTP/Status

헤더

공통 헤더

  • Date : http 메시지가 만들어진 시각
    • Date: Wed, 13 Apr 2022 13:00:55 GMT
  • Cache-Control : 캐싱(브라우저에 서버에서 받은 데이터 저장) 관련 설정
    • Cache-Control: max-age=0
  • Content-Length : 요청/응답 메시지의 본문 크기(바이트단위)
    • Content-Length: 28382
  • Content-Type : POST/PUT 메서드를 사용할 때 본문(바디 메시지)의 타입
    • Content-Type: text/html; charset=utf-8 - 응답
    • Content-Type: multipart/form-data - 요청
  • Content-Encoding : 컨텐츠의 압축된 방식, 브라우저는 알아서 풀어서 사용
    • Content-Encoding: gzip, deflate

요청 헤더

  • Host : 서버의 도메인 이름과 TCP 포트번호 (표준 포트는 생략 가능)
    • Host: en.wikipedia.org:8080
  • User-Agent : 요청보낸 사용자의 운영체제 브라우저등 정보
    • User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
  • Accept : 응답 받고 싶은 형식을 명시
    • Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    • Accept-Encoding: gzip, deflate, br
    • Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
  • Authorization : 인증토큰을 서버로 보낼 때 사용
    • authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5~~~
  • Origin : 요청이 어느 도메인에서 왔는지 명시, 서버의 Access-Control-* 속성에 필요
    • origin: https://codecamptest.shop
  • Cookie : 서버의 Set-Cookie 로 설정된 쿠키 값
    • cookie: refreshToken=eyJhbGciOiJIUzI1NiIsInR5cCI~~~
  • Referer : 이전 페이지의 주소. 어떤 페이지에서 지금 페이지로 들어왔는지 알 수 있음
    • referer: https://codecamptest.shop/
  • If-Modified-Since : 명시한 날짜 이후로 변경된 리소스만 획득
    • If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

응답 헤더

  • Access-Control-* : CORS를 허용하기 위한 웹사이트 명시
    • Access-Control-Allow-Origin: *
  • Allow : 요청한 리소스에 대해 가능한 메서드들
    • Allow: GET, HEAD
  • Set-Cookie : 클라이언트에 쿠키 설정
    • Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
  • Content-Disposition : 응답 본문 브라우저 처리 방법
    • Content-Disposition: inline - 웹페이지 화면에 표시
    • Content-Disposition: attachment; filename='filename.csv' - 다운로드(파일명)
  • Location : 3xx, 201 상태 코드일 때, 리다이렉션 되는 주소
    • Location: http://www.w3.org/pub/WWW/People.html
  • Last-Modified : 요청한 리소스가 마지막으로 변경된 시각
    • Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT

HTTPS

HTTP 동작 순서 : TCP → HTTP
HTTPS 동작 순서 : TCP → SSL/TLS → HTTP

SSL(Secure Socket Layer)을 쓰냐 안쓰냐의 차이다. SSL 프로토콜은 정보를 암호화시키고 이때 공개키와 개인키 두가지를 이용한다.
약어에서의 "S"가 원래 SSL(Secure Socket Layer)의 약자였지만 SSL 버전 3.1부터 TLS(Transport Layer Security)로 명칭이 바뀌고 TLS와 혼용하고 있다.
HTTPS는 인터넷 상에서 정보를 암호화하기 위해 TLS 프로토콜을 이용해 데이터를 전송하고 있다는 것을 말한다. 즉, 문서 전송시 암호화 처리 유무에 따라 HTTP와 HTTPS로 나누어지는 것
암호화 과정으로 인한 속도 저하가 발생하긴하지만 보안상 안전하고 검색엔진최적화(SEO)에 있어서 혜택이 있다.

동작방식

HTTPS는 대칭키 암호화를 사용 하며 다음과 같은 과정을 거친다.
1. 클라이언트가 서버에게 접속요청을 하면 서버는 CA에서 발급받은 인증서를 보낸다. 인증서에는 CA의 비밀키로 암호화된 사이트정보와 공개키가 들어있다.
2. 클라이언트는 인증서를 받아 CA의 공개키로 복호화하여 접속요청한 서버가 신뢰할만한지 검증한다.
3. 복호화가 되면 인증서가 신뢰할 만하기 때문에 데이터를 주고받을 대칭키를 생성한다.
4. 대칭키를 서버의 공개키로 암호화하여 서버에게 전송한다.
5. 서버는 자신의 비밀키로 클라이언트가 보낸 대칭키를 복호화한 뒤 그 대칭키를 통해 데이터를 주고받는다.

HTTP2

HTTPS의 보안 기능과 함께 요청 및 응답 다중화로 성능도 강화된 HTTP2 최근에는 HTTP3까지 있다.

0개의 댓글