CS공부/네트워크

[네트워크/웹] 쿠키와 세션

이숭간 2021. 7. 17. 00:57
728x90

쿠키와 세션을 알기 이전에 왜 쿠키와 세션이 나왔는지에 대해 이해해야한다. 이를 위해선 HTTP프로토콜의 특징부터 이해해야한다.

 

HTTP프로토콜의 특징

  • 비 연결성 (Connectless)
    • 클라이언트가 request를 서버에 보내고, 서버의 response를 보내면 연결이 끊긴다.
  • 상태유지 X (Stateless)
    • 연결을 끊는순간 서버는 클라이언트의 상태정보를 유지하지 않는다.

쿠키와 세션은 왜 필요한가?

  • HTTP프로토콜의 위와같은 특성으로 인해, 클라이언트와 서버간 상태정보를 저장할 필요가 있는경우 (로그인유지 등) 에 사용한다.
  • 현재 접속한 사용자가 이전에 접속한 사용자와 같은 사용자인지 아닌지를 알 수 있는 방법이 없다.
  • HTTP프로토콜에서 상태를 유지하기위한 기술로 쿠키와 세션을 사용한다. 쿠키와세션의 단점을 보완한 토큰을 이용한 방법도 있다.

 

쿠키란?

  • 클라이언트 로컬에 저장되는 키, 값으로 이루어진 파일
  • 이름, 값, 유효시간, 경로 등을 포함한다.
  • 클라이언트의 상태정보를 브라우저에 저장하여 참조한다.

1. 쿠키의 구성요소

  • 쿠키의 이름(name)
  • 쿠키의 값(value)
  • 쿠키의 만료시간(Expires)
  • 쿠키를 전송할 도메인 이름(Domain)
  • 쿠키를 전송할 경로(Path)
  • 보안 연결 여부(Secure)
  • HttpOnly 여부(HttpOnly)

2. 쿠키의 동작방식

  1. 웹브라우저가 서버에 요청
  2. 상태를 유지하고 싶은 값을 쿠키(cookie)로 생성
  3. 서버가 응답할 때 HTTP 헤더(Set-Cookie)에 쿠키를 포함해서 전송
  4. Set−Cookie: id=doy
  5. 전달받은 쿠키는 웹브라우저에서 관리하고 있다가, 다음 요청 때 쿠키를 HTTP 헤더에 넣어서 전송
  6. cookie: id=doy
  7. 서버에서는 쿠키 정보를 읽어 이전 상태 정보를 확인한 후 응답

3. 쿠키는 언제 사용하는가?

  • 아이디, 비번 (이제는 보안상의 이유로 쿠키에 이런정보는 저장 X)
  • 쇼핑몰 장바구니

 

세션이란?

  • 서버에서 저장하는 상태정보
  • 일정 시간동안 같은 브라우저로부터 들어오는 요청을 하나의 상태로 보고 그 상태를 유지하는 기술
  • 브라우저를 통해 서버로 접속한 시점부터 브라우저를 종료할때까지 유지되는 상태

2. 세션의 동작방식

  1. 웹브라우저가 서버에 요청
  2. 서버가 해당 웹브라우저(클라이언트)에 유일한 ID(Session ID)를 부여
  3. 서버가 응답할 때 HTTP 헤더(Set-Cookie)에 Session ID를 포함해서 전송쿠키에 Session ID를 JSESSIONID 라는 이름으로 저장
  4. Set−Cookie: JSESSIONID=xslei13f
  5. 이후에 웹브라우저를 닫을때까지 요청 때 부여된 Session ID가 담겨있는 쿠키를 HTTP 헤더에 넣어서 전송
  6. Cookie: JSESSIONID=xslei13f
  7. 서버는 세션 ID를 확인하고, 해당 세션에 관련된 정보를 확인한 후 응답

3. 세션을 언제 사용하는가?

  • 로그인
  • 세션도 쿠키를 사용하여 값을 주고받으며 클라이언트 상태정보를 유지하기때문에 세션을 이용한다는것은 결국 쿠키를 이용해야하는것이다.

 

쿠키와 세션의 차이

  • 저장위치
    • 쿠키: 클라이언트
    • 세션 : 서버
  • 보안
    • 쿠키: 클라단에 저장되므로 보안에 취약
    • 세션 : 쿠키에비해 보안이 좋다. 세션 ID만 저장하고있고 이 값으로 구분해서 서버에서 처리하므로
  • 라이프사이클
    • 쿠키 : 만료시간에 따라 브라우저를 종료해도 계속 유지될수 있다. (쿠키 만료시간이 남은경우)
    • 세션 : 만료시간을 정할 수 있지만 브라우저가 종료되면 만료시간에 상관없이 삭제된다. ( 쿠키가 남아있어도 세션이 종료되었으므로 쿠키에 담긴 세션아이디로 인증불가 )

세션을 사용할때의 단점

  • 세션정보를 서버측에 저장하고 있기 때문에 서버의 수평적 확장(스케일아웃)이 불가능하다. (요청1- 서버A, 서버A에 세션정보 저장, 다음요청 - 서버B , 서버B는 세션정보가 없으므로 인증이 안됨)
  • 세션서버를 따로 둘경우에 위 문제를 해결가능하지만 세션서버가 죽게되면 모든 세션정보를 잃어버리는 문제가 발생한다.

쿠키와 세션을 보완한 토큰방식

  • 토큰방식을 이용하면 HTTP프로토콜의 특성을 유지할 수 있다. (Stateless)
  • 토큰을 이용하면 서버에서 상태정보를 몰라도 클라이언트의 요청에 담긴 토큰을 가지고 토큰의 유효성을 검증하고 인증 및 인가를 거치게되고 클라이언트는 권한을 얻게된다.
  • 이때 토큰자체에 사용자정보를 담고있는 클레임기반 토큰(JWT)와 단순 문자열로이루어진 토큰으로 나뉘어진다. 후자의경우 DB에 저장하고 비교하는 추가처리가 필요하다.