HTTP 정리 with Cookie, Web Storage, CORS Concept
HTTP
정의
HTTP는 Hyper Text Transfer Protocol의 약자로 w3(world wide web) 상에서 서버들과 클라이언트들이 정보를 주고받을 수 있는 프로토콜이다. 클라이언트가 HTTP Request를 하고, 서버가 HTTP Response를 응답한다. 주로 TCP를 이용하고, HTTP/3 부터는 UDP를 사용한다. Stateless한 것이 특징이다.
- TCP: Transmissio Control Protocol. 전송 계층. 연결형 프로토콜
- UDP: User Datagram Protocol. 전송계층. 비 연결형 프로토콜
HTTP Versions
HTTP 0.9
- 단순
- HTML만 전송 가능
HTTP 1.0
- 헤더가 추가 됨
- 상태 코드, Content- Type 등
- HTML 외에 다른 형식의 응답 가능
- 커넥션 당 하나의 Request와 하나의 Response만 가능
HTTP 1.1
- Persistent Connection 개념 추가
- 지정한 timeout 동안 커넥션을 닫지 않음
- 하나의 커넥션으로 여러 Request, Response 처리 가능
- Pipelining 도입
- 기존) 여러 요청을 할 경우, 앞의 요청에 대한 응답이 온 후에 다음 요청을 보내는 방식
- 하나의 커넥션에서, 여러 요청을 연속적으로 보내고, 그 순서에 맞춰서 응답을 받는 방식 → 지연시간을 줄일 수 있음
- 문제점) 앞선 요청이 서버에서 처리가 오래 걸릴 경우, 다음 요청 응답들도 기다려야함 → HOL Blocking(Head of Line Blocking)
HTTP 2.0
- 2015 released
- HTTP 1.1 버전의 성능 향상을 목적으로 함
- 요청을 HEADERS frame과 DATA frame으로 분류
- 메시지 전송 시 바이너리로 인코딩
- 스트림 단위로 request, response
- Request와 Response Multiplexing
- 여러 stream들을 interleaving 방식으로 mix해서 보낸 후, 조합 가능
- HOL Blocking(Head of Line Blocking) 해결
- Stream Prioritization
- 리소스간 우선 순위 설정 가능
- Server Push
- 클라이언트가 요청하지 않은 데이터를 서버가 알아서 전송
- Header Compression
- 중복된 필드를 재전송 하지 않음
- Header가 평문이었던 기존 방식에서 Huffman Coding(데이터 문자의 빈도에 따른 길이의 부호를 사용)을 사용해 압축
Cookie
서버가 전송한 데이터-쿠키를 클라이언트-브라우저가 저장해 두었다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송한다.. 요청이 이전과 동일한 브라우저에서 이루어짐을 확인할 수 있다. Stateless한 HTTP 프로토콜에서 로그인, 장바구니 정보 등을 관리하기 위해 사용된다.
특징
- 서버가 응답에 ‘Set-Cookie’ 헤더를 이용하여 쿠키를 전송한다. 이 값이 브라우저에 의해 저장된 후, 이후 요청의 ‘Cookie’ 헤더에 포함되어 전송된다.
- 쿠키 길이 제한 - 4KB
- 각 사이트마다 최대 20개의 쿠키 저장 가능
- 클라이언트에 최대 300개 저장 가능
- 브라우저가 종료 되어도 유지된다.
- Expires, Max-Age를 명시 할 경우 → Permanent Cookie, 아무것도 명시하지 않을 경우 → Session Cookie (브라우저 종료 시 제거 됨)
Web Storage
HTML5의 새로운 기능으로, 클라이언트-브라우저에 데이터를 저장할 수 있다.
- 5MB 까지 사용 가능
- (숫자로 저장 하더라도) 문자열로 저장, 조회
Local Storage
- 브라우저 자체에 반영구적으로 데이터 저장
- 브라우저를 종료해도 데이터가 유지됨
- 도메인이 다른 경우 접근 불가
- 페이지 프로토콜별로 구분됨 (ex) http, https)
Session Storage
- 각 세션마다 데이터가 분리되어 저장 (여러 탭, 창마다 데이터가 격리됨)
- 페이지 세션이 끝날때(페이지를 닫을 때) 데이터가 제거
- 도메인이 같아도 세션이 다르면 데이터에 접근 불가
CORS
Cross-Origin Resource Sharing(교차 출처 자원 공유)의 약자로, 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션에서 다른 출처의 자원에 접근할 수 있는 권한을 부여하도록 브라우저에 알려주는 보안 매커니즘
- ex) 허용된 Frontend UI에서만 서버의 자원을 요청할 수 있도록 제한하는 경우 사용
- Protocol + Domain + Port가 같을 경우 같은 Origin
- 브라우저는 Request 요청에 ‘Origin’ 라는 헤더와 Response의 ‘Access-Control-Allow-Origin’ 라는 헤더가 같으면 같은 출처로 인식
- SOP (Same-Origin Policy) - 같은 출처에서만 리소스를 공유할 수 있다는 보안 정책, CORS 정책을 지켰을 경우 허용한다.
HTTP Message
HTTP 요청은 HTTP Method, URL, Header, Body 등으로 이루어 진다.
HTTP Methods
- GET - 서버로 부터 정보를 조회
- POST - 서버에 데이터를 제출
- PUT - 서버의 데이터를 update
- DELETE - 서버의 데이터를 삭제
HTTP Headers
General
- Request URL
- Request Method
- Status Code
- Remote Address
- Referrer Policy
Response
- Server
- Set-Cookie
- Content-Type
- Date
Request
- Cookies
- Accept-xxx
- Content-Type
- Content-Length
- Authorization
- User-Agent
- Referrer
Status Codes
- 1xx (Informational) - Request가 요청되었고, 작업중인 경우
- 2xx (Success) - 성공적으로 Request가 요청되었고, 받아들여진 경우
- 3xx (Redirect) - redirect가 필요한 경우
- 4xx (Client Error) - 요청에 문제가 있을 경우
- 5xx (Server Error) - 서버에서의 작업이 실패한 경우
주요 Status Codes
200 - OK
201 - 요청이 성공적으로 처리되었음, 자원이 생성됨
301 - Moved to new URL
304 - Not modified, 재전송할 필요가 없음
400 - Bad request
401 - Unauthorized
404 - Not found
500 - Internal server error
HTTP Request/Response Example
크롬의 개발자 도구를 통해 확인한 HTTP 요청을 한 경우의 예제는 아래와 같다. (URL https://ko.wikipedia.org/wiki/HTTP 를 사용)
- General
Request URL: https://ko.wikipedia.org/wiki/HTTP
Request Method: GET
Status Code: 200
Remote Address: 103.102.166.224:443
Referrer Policy: strict-origin-when-cross-origin
- Request Headers
:authority: ko.wikipedia.org
:method: GET
:path: /wiki/HTTP
:scheme: https
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
cache-control: max-age=0
cookie: GeoIP=KR:41:Seongnam-si:37.44:127.14:v4; kowikimwuser-sessionId=31eb9c8757e7f0040a08; WMF-Last-Access-Global=07-Mar-2021; WMF-Last-Access=07-Mar-2021; kowikiel-sessionId=59aa09c9f5756a9bb55e; kowikiwmE-sessionTickLastTickTime=1615123244046; kowikiwmE-sessionTickTickCount=8
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: none
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36
- Response Headers
accept-ranges: bytes
age: 537
cache-control: private, s-maxage=0, max-age=0, must-revalidate
content-encoding: gzip
content-language: ko
content-length: 36823
content-type: text/html; charset=UTF-8
date: Sun, 07 Mar 2021 13:12:43 GMT
last-modified: Wed, 24 Feb 2021 06:21:57 GMT
nel: { "report_to": "wm_nel", "max_age": 86400, "failure_fraction": 0.05, "success_fraction": 0.0}
p3p: CP="See https://ko.wikipedia.org/wiki/Special:CentralAutoLogin/P3P for more info."
report-to: { "group": "wm_nel", "max_age": 86400, "endpoints": [{ "url": "https://intake-logging.wikimedia.org/v1/events?stream=w3c.reportingapi.network_error&schema_uri=/w3c/reportingapi/network_error/1.0.0" }] }
server: ATS/8.0.8
server-timing: cache;desc="hit-front"
strict-transport-security: max-age=106384710; includeSubDomains; preload
vary: Accept-Encoding,Cookie,Authorization
x-cache: cp5011 miss, cp5012 hit/1
x-cache-status: hit-front
x-client-ip: x.x.x.x
x-content-type-options: nosniff
x-request-id: YDYTSXxH2zOzzvbpPqhbAwAAANA
Source
- https://ko.wikipedia.org/wiki/HTTP
- https://developer.mozilla.org/ko/docs/Web/HTTP
- https://www.youtube.com/watch?v=iYM2zFP3Zn0&t=2045s - Traversy Media
- https://www.youtube.com/watch?v=xcrjamphIp4&t=248s - 우아한 Tech
- https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage
- https://www.daleseo.com/js-web-storage/
- https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/OPTIONS
- https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
Leave a comment