본문 바로가기
개발/Computer Science

세션 (Session) 과 토큰 (Token)

by Ulegi 2023. 2. 22.

안녕하세요? 일 잘하고 싶은 Ulegi 입니다. 흑흑흑😂

 

익숙하신 분들은 자세히 숙지하고 계시겠지만,

초심자에게는 쿠키와 캐시, 세션과 토큰 등의 이름만 익숙할 뿐 세부적인 부분은 조금 생소합니다🥲

 

저희가 웹서비스를 사용/개발 할 때 로그인에 대해 인증해주고 이를 유지해주는 세션과 토큰에 대해 알아보겠습니다!

 


세션 (Session) / 토큰 (Token) 의 비교

 

우선! 세션과 토큰이 사용되는 이유

HTTP 는 stateless 특성이기에 각 통신 상태를 저장하지 않습니다.

  • stateless : 서버가 클라이언트의 이전 상태를 보존하지 않는 특성

이를 해결하기 위해 우리는 세션 (session), 토큰(Token) 을 사용합니다.

 

사이트가 사용자의 로그인 상태를 기억하고 유지하는 방법

  • 세션
    • 사용자가 사이트에 한 번 로그인하면 지정한 기간이 만료될 때까지는 아이디와 비밀번호를 입력하지 않아도 되도록 사용자가 서버로부터 인증받았음을 증명하는 증서
    • 아이디와 비밀번호로 로그인에 성공하면 서버에서 "세션 ID"를 만들어줍니다.
    • 사용자는 서버에게 받은 세션ID를 쿠키로 저장 후, 모든 요청에 이를 함께 전달합니다.
    • 쿠키에 세션ID가 담겨있기 때문에 브라우저는 요청 시 모든 요청마다 쿠키와 함께 세션ID를 전송하게 됩니다.
    • 서버는 클라이언트가 보낸 세션ID서버 메모리를 관리하고 있는 세션ID를 비교해서 일치하면 Authorization(인가)을 수행합니다.
    • 이를 통해 사용자는 매번 사이트에 아이디와 비밀번호로 로그인을 하지 않아도 됩니다.
  • 토큰
    • 사용자가 로그인을 요청하고 ID와 비밀정보가 유효하다면 서버가 Secret Key를 사용하여 사용자에게 "토큰"을 발급하여 전달합니다.
    • 클라이언트는 발급 받은 토큰을 저장하고, 서버에서 요청 할 때 마다, 만들어진 토큰을 함께 서버에 전달합니다. 이에 서버는 토큰 검증 후, 요청에 응답합니다.
    • 토큰은 크게 Header, Payload, Signature 로 구성되어 있습니다.
      • Header : 토큰을 어떻게 검증할지가 담겨있습니다.
      • Payload : 토큰에 담긴 사용자 정보(어디에서 어디로, 유효기간, 권한 등)이 담겨있습니다.
        • 사용자정보가 토큰에 들어있으므로 서버 요청 시, DB까지 가서 찾을 필요가 줄어듭니다.
        • Payload는 암호화 되지는 않고 Base64로 인코딩만 되어있어 디코딩 시, 데이터탈취가 가능합니다. (중요한 정보는 X)
      • Signature : Header + Payload + SecretKey 로 토큰을 암호화 시켜 변조에 대비합니다.

 

세션과 토큰의 비교

저장공간

  • 세션 : 서버의 메모리/DB에 저장 및 관리
    • 서버에 저장하기에 관리가 효율적입니다.
    • 대신 클라이언트가 많을 시 메모리/DB에 부하가 올 수 있습니다.
  • 토큰 : 클라이언트(웹 브라우저)에 저장
    • 따라서 서버 메모리에 부담이 되지 않습니다.
    • 멀티 디바이스 환경에 부담이 없습니다.
    • 대신 암호화가 풀리더라도 토큰이 활용될 수 없도록 유효기간을 짧게 가져가야합니다.

보안

  • 세션
    • 서버에 저장되기 때문에 공격에 노출될 가능성이 토큰 보다는 낮습니다.
    • 공격의 위험에 대비하기 위한 방법으로는
      • 유효기간 설정
      • HttpOnly (서버로 HTTP 요청을 보낼 경우만 쿠키 전송 허용 - XSS 차단)
      • Secure (HTTPS로 통신하는 경우만 쿠키전송 허용) 등의 옵션과 함께 쿠키와 저장하는 방법이 있습니다.
  • 토큰
    • 웹브라우저에 저장되기 때문에 공격에 노출될 가능성이 세션보다는 높습니다.
    • 이에 토큰의 Body중 Signature에서의 암호화로 변조에 대비합니다.
    • 또한 토큰은 유효기간을 짧게 설정하여 공격에 노출될 시간을 최소화합니다.
      • refresh token (토큰의 짧은 유효기간에 대한 대안)
        • 일반 토큰 (Access Token)을 생성할 때 동시에 생성하여, 일반 토큰보다 더 긴 유효기간을 설정하여 안전한 저장소에 저장합니다.
        • 일반 토큰이 만료되었을때, refresh token을 확인하여 유효기간이 지나지 않았다면 새로운 일반 토큰을 발급하여 접근을 가능하게 해줍니다.

'개발 > Computer Science' 카테고리의 다른 글

쿠키 (Cookie) 와 캐시 (Cache)  (2) 2023.02.22

댓글