쿠키, 세션, 토큰?

Server_side·2023년 9월 21일
3

CS 지식

목록 보기
1/2
post-custom-banner

서론

소프트웨어 개발에 관심을 가지고 공부를 해오면서 쿠키, 세션, 토큰, 스택, 힙, 큐, 이벤트루프 등 처음 듣는 용어들을 수 없이 들어왔다.
하지만, 그것들이 무엇인지 제대로 알지도 못하면서 마냥 고개만 끄덕이며 자세히 알아볼 생각을 하지 않은 것 같다.
이제 개발을 공부한지 짧다면 짧은 4개월차지만 그동안 쌓여왔던 모르는 용어, 이론들에 대해 지금부터라도 자세히 알아보고자 한다.
첫 발걸음은 쿠키, 세션, 토큰에 관한 것이다.

간단한 정의

  • 쿠키(Cookie): 정보를 담아 옮겨주는 매개체 (택배 박스가 떠올랐다)
  • 세션(Session): 브라우저 이용 시, 사용자 관리를 위한 목적으로 웹 통신간 유지가 필요한 정보를 일정 기간동안 서버 DB에 저장/보관하는 방법
  • 토큰(Token, JWT 기준): 'sign'을 통해 생성된 인증 목적의 토큰(클라이언트 측에 저장됨)

1. 쿠키(Cookie)

쿠키란 서버가 내 브라우저에 여러 정보를 저장하기 위해 만든 박스와 같은 작은 저장 공간을 의미한다.

  • 동작 방식

    1. 내가 웹사이트를 방문하면 브라우저는 서버에 요청을 보냄. 이때 서버는 페이지에 대한 응답을 주며 정보를 저장할 수 있는 쿠키를 함께 전송함.
    2. 내가 웹사이트를 이용하며 편의성을 위해 설정한 정보들이 쿠키에 저장되고, 해당 쿠키는 서버에 정보 요청 시마다 전송됨.(ex. 언어설정 등)
    3. 해당 쿠키는 내 브라우저에 저장되어 있기 때문에 쿠키가 지워지거나 서버가 설정한 유효기간이 만료되지 않았다면, 추후 해당 웹사이트 재방문 시 이전에 저장된 쿠키가 함께 서버로 전송됨.
  • 각 도메인에 따라 독립적

    예를 들어, 인스타그램의 쿠키는 인스타그램을 이용할때만 유효하며 타 웹사이트에서는 적용되지 않는다.

2. HTTP의 특성 stateless

HTTP는 stateless 특성을 가지므로 서버는 요청에 대해 응답한 후에 해당 요청 및 응답에 대해 저장하지 않는다.(모든 요청/응답은 독립적)
이에, 로그인이 필요한 페이지 접근시마다 매번 로그인을 한다면 매우 번거로울 것이다.
따라서, 이러한 문제를 해결하기 위한 두가지 방법이 세션 및 토큰이다.

  • stateless (무상태): 서버가 클라이언트의 상태를 보존하지 않음을 의미

3. 세션(Session)

세션이란 위에서 언급했듯이 HTTP stateless 특성의 문제점을 보완하기 위한 방법 중 하나로 쿠키 기반의 인증 시스템이다.

  • 동작 방식
    1. 유저는 로그인 시 필요한 ID, PW를 서버에 전송
    2. 수신된 ID, PW가 일치한다면, 서버는 세션DB에 세션ID와 함께 유저를 생성
    3. 서버는 세션 ID를 쿠키에 담아 클라이언트로 전송하고 클라이언트는 쿠키를 브라우저에 저장
    4. 이 후, 로그인이 필요한 페이지 접근 시 ID, PW를 통해 다시 로그인하는 것이 아닌 쿠키에 저장된 세션ID를 통해 유저 인증

4. 토큰(Token)

토큰은 JWT(JSON Web Token)을 기준으로 작성하였다.

세션과 마찬가지로 HTTP stateless 특성의 문제점 보완을 위한 방법으로 쿠키 기반의 인증 시스템인 세션과는 달리 JWT는 토큰 기반의 인증 시스템이다.

  • 동작 방식
    1. 유저는 로그인 시 필요한 ID, PW를 서버에 전송
    2. 수신된 ID, PW가 일치 한다면, 서버는 ID 정보(이외의 유출되어도 치명적이지 않은 정보)를 'sign'이라는 방식을 통해 생성된 문자열이 저장된 토큰을 유저에게 전송 (해당 토큰은 세션과는 달리 서버에 저장되지 않음)
    3. 이 후, 로그인이 필요한 페이지 접근 시 ID, PW를 통해 다시 로그인하는 것이 아닌 토큰을 통해 서버가 토큰 유효성을 검증하여 유저 인증

5. 세션과 토큰 비교

  • 안전성

    세션

    1. 세션은 정보를 서버측에서 저장/관리하므로 토큰에 비해 안전성이 높음
    2. 세션이 정보를 서버에 저장한다고 마냥 안전한 것만은 아니며 유효기간 등의 옵션을 통해 안전성을 높임

    토큰

    1. 클라이언트측에 저장되는 토큰은 암호화되지 않아 누구나 열어서 확인 가능하므로 중요한 정보를 저장하지 않음
  • 속도

    세션

    1. 세션은 세션DB에서 세션ID를 검색하는 등의 처리가 필요하므로 토큰에 비해 상대적으로 느림

    토큰

    1. 토큰은 세션과 달리 유효성 검증만하면 되므로 빠르고 가벼움
  • 서버 부하

    세션

    1. 세션은 서버에 정보가 저장되므로 사용자가 늘어날수록 서버 부담이 증가됨
    2. 서버 부담이 증가한다는 것은 비용이 증가한다는 말과 일맥상통

    토큰

    1. 하지만 토큰의 경우, 클라이언트측에 저장되기 때문에 서버 부하 ↓
  • 접근 통제

    세션

    1. 세션의 경우, 세션 DB에서 세션ID를 삭제하면 해당 세션ID가 들어있는 쿠키로는 유저정보로 접근 불가능
    2. 예를 들어, 특정 유저를 로그아웃시키고 싶거나 넷플릭스와 같이 로그인 인원 수 제한 시 활용 가능함

    토큰

    1. 서버는 토큰 정보를 따로 저장하지 않고 토큰에 대한 유효성만 검증하기때문에 세션과는 달리 접근 통제 불가능

위와 같은 장단점들을 비교하여 서비스에 맞는 인증 방법 채택이 중요할 것으로 생각된다.

참고

'노마드 코더 Nomad Coders'님

profile
아마도 난 백엔드 style?
post-custom-banner

0개의 댓글