[HTTP] HTTP Header(인증, 쿠키)

Yujeong·2024년 1월 5일
0
post-thumbnail

모든 개발자를 위한 HTTP 웹 기본 지식 강의 수강 후, 정리한 글입니다.

목차

  1. 인증
  2. 쿠키

1. 인증

1) Authorization

Authorization은 클라이언트 인증 정보를 서버에 전달하는 방식이다.

  • Basic xxxxxxxxxxxxxxxx

2) WWW-Authenticate

WWW-Authenticate는 리소스 접근시 필요한 인증 방법을 정의하는 것이다.

  • HTTP Status Code인 401 Unauthorized와 함께 사용
  • Newauth realm="apps", type=1, title="Login to \"apps\"", Basic realm="simple"
    ①②③

2. 쿠키

Set-Cookie는 서버에서 클라이언트로 쿠키를 전달하는 것이고, Cookie는 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달하는 것이다.

즉, "Set-Cookie" 헤더는 웹 서버에서 전송되고, 브라우저는 "Cookie"라는 HTTP 헤더를 통해 쿠키를 서버에 다시 보낸다.

쿠키를 사용할 때와 미사용할 때를 비교해보면, 쿠키를 사용하는 이유를 이해하기 쉽다.

1) 쿠키 미사용

한 홈페이지에 접속하여 로그인한다고 생각해보자.
① 처음 welcome 페이지에 접근하면, "안녕하세요. 손님"이라는 200 OK 응답을 받을 수 있다.
② 홈페이지에 로그인하면, "홍길동님이 로그인했습니다."라는 200 OK 응답을 받는다.
③ 로그인한 상태에서 welcome 페이지에 다시 접근하면, 로그인했음에도 불구하고 "안녕하세요. 손님"이라는 200 OK 응답을 받는다.

HTTP는 기본적으로 무상태 프로토콜(stateless)이라 한번 연결된 후에는 연결을 끊어버리기 때문에 로그인한 사용자인지 구분할 수가 없다. 즉, 서버는 이전 요청을 기억하지 못한다.
그래서 쿠키가 필요하다!

그렇다면, 모든 요청과 링크에 사용자 정보를 포함하면 되지 않는가? 라는 의문이 생길 수도 있다.

GET /welcome?user=홍길동 HTTP/1.1
GET /board?user=홍길동 HTTP/1.1
GET /order?user=홍길동 HTTP/1.1

이런식으로 한다면, 보안에서 문제가 생길 수 있기 때문에 쿠키를 사용하도록 하자.

2) 쿠키 사용

① 로그인시에 서버가 클라이언트에 Set-Cookie: user=홍길동 HTTP 헤더에 포함하여 보내면, 웹 브라우저 내부에 있는 쿠키 저장소에 user=홍길동을 저장한다.
② 로그인 이후에 welcome 페이지에 다시 접근하면, 쿠키 저장소에서 조회하여 HTTP 헤더에 Cookie: user=홍길동을 포함하여 서버에 요청한다. 서버는 "안녕하세요. 홍길동님."라는 200 OK 응답을 보낸다.

하지만, 모든 요청에 쿠키 정보를 자동 포함하여 주민번호, 신용카드 번호와 같은 개인정보를 보내면 보안 문제가 생길 수 있다. 그래서 sessionId를 사용한다.

예시) set-cookie: sessionId=qwer1234; expires=Fri, 01-Jan-2024 00:00:00 GMT; path=/; domain=.google.com; Secure

① sessionId

sessionId=qwer1234

사용처

  • 사용자 로그인 세션 관리
  • 광고 정보 트래킹

쿠키 정보는 항상 서버에 전송됨

  • 네트워크 트래픽 추가 유발
  • 최소한의 정보만 사용(세션id, 인증 토큰)
  • 서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 웹 스토리지(localStorage, sessionStorage)

② 쿠키 생명주기

expires=Fri, 01-Jan-2024 00:00:00 GMT

expires

  • Set-Cookie: expires=Fri, 01-Jan-2024 02:33:34 GMT
  • 만료일이 되면 쿠키 삭제
  • expires는 GMT 기준

max-age

  • Set-Cookie: max-age=3600
  • 3600초
  • 0이나 음수를 지정하면 쿠키 삭제

세션 쿠키: 만료 날짜를 생략하면 브라우저 종료시까지만 유지
영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지

③ 쿠키 도메인

domain=example.com

명시

  • 명시한 문서 기준 도메인 + 서브 도메인 포함
  • domain=example.org를 지정해서 쿠키 생성
    example.com, dev.example.com 모두 쿠키 접근

생략

  • 현재 문서 기준 도메인만 적용
  • example.com에서 쿠키를 생성하고 domain 지정을 생략
    example.com에서만 쿠키 접근, dev.example.com은 쿠키 미접근

④ 쿠키 경로

path=/home

이 경로를 포함한 하위 경로 페이지만 쿠키 접근할 수 있다. 보통 path=/의 루트로 지정한다.
예시로 path=/home을 지정한다고 하면, 다음의 경로에 접근할 수 있다.

  • /home
  • /home/level1
  • /home/level1/level2

아래의 경우는 접근 불가능하다.

  • /cookie

⑤ 쿠키 보안

Secure

  • 쿠키는 http, https를 구분하지 않고 전송
  • Secure를 적용하면 https인 경우에만 전송

HttpOnly

  • HTTP 전송에만 사용
  • XSS 공격 방지
  • 자바스크립트에서 접근 불가(document.cookie)

SameSite

  • 요청 도메인과 쿠키에 설정된 도메인이 같은 경우에만 쿠키 전송
  • XSRF 공격 방지

🗒️ 무상태 프로토콜

1. HTTP는 무상태(Stateless) 프로토콜
2. 클라이언트와 서버는 서로 상태를 유지하지 않는다.
3. 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어진다.
4. 클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못한다.

🗒️ 웹 스토리지: 서버에 전송할 필요는 없을 때 사용


참고
what is the difference between Set-Cookie and cookie

profile
공부 기록

0개의 댓글