Session vs Token(Jwt)

dohyun-dev·2023년 6월 18일
4

Session과 JWT

목록 보기
1/2

개요

HTTP의 특성

Rest API 통신을 하기위해 우리는 HTTP를 많이 사용합니다.

먼저 Session과 JWT의 대해서 알아보기 위해서 HTTP의 특성에 대해서 알아봅시다.

비연결성 (Connectionless)

비연결성은 클라이언트와 서버가 데이터를 주고 받기 위해서 Connection을 맺은 후 클라이언트의 요청에 서버가 응답을 마치면 Connection을 끊어버리는 성질을 말합니다.

무상태성 (Stateless)

서버는 비연결성으로 인해 요청마다 각 클라이언트를 식별할 수가 없습니다. 이를 무상태성이라고 합니다.

이러한 HTTP의 특성으로 인해서 서버가 클라이언트를 식별하기 위해서는 상태를 저장하는 곳이 필요합니다.

인증과 인가

서버는 클라이언트의 신원을 검증하고(인증) 클라이언트의 요청을 승인(인가)하기 위해서는 무상태성을 해결할 기술이 필요합니다.

Session과 Token

Session

세션은 사용자의 정보를 브라우저가 아닌 서버에서 사용자 정보를 저장하는 구조이다.

동작흐름

  1. 클라이언트가 서버에게 로그인 요청을 한다.
  2. 서버는 사용자의 아이디와 비빌번호를 확인한 후 Session-Id를 클라이언트에게 쿠키로 전송한다.
  3. 클라이언트는 요청을 보낼 때마다 서버는 쿠키에 있는 Session-Id가 세션 저장소에 존재한다면 인가를 진행한다.

Token (토큰)

토큰 기반 인증은 서버가 발급한 토큰을 클라이언트가 직접 보관하는 방식입니다.

동작흐름

  1. 클라이언트가 서버에게 로그인 요청을 한다.
  2. 서버는 사용자의 아이디와 비빌번호를 확인한 후 새롭게 발급된 토큰을 클라이언트에게 쿠키 또는 ResponseBody로 전송한다.
  3. 클라이언트는 요청을 보낼 때마다 토큰을 서버에게 전송한다.
  4. 서버는 토큰의 위변조 여부와 만료 시간을 확인하고 인가를 진행한다.

Session vs Token(JWT)

서버의 자원 사용 측면

  • 세션 기반 인증은 Session-Id를 세션 저장소에 확인하는 과정을 거쳐야 되기 때문에 비용이 많이 발생한다.

  • 그에 반해 토큰 기반 인증은 토큰의 위변조 여부와 만료 시간만 확인하면 되기 때문에 검증에 비용이 적다.

보안 측면

  • 세션 기반 인증은 쿠키가 탈취되더라도 사용자의 정보를 서버에 저장하기 하기 때문에 사용자 정보를 알기 어렵습니다. 또한 탈취한 쿠키를 통해 비정상적인 접근을 시도 하더라도 세션저장소에 Session-Id를 삭제하면 되기 때문에 비교적 안전합니다.

  • 토큰 기반 인증은 payload가 암호화 되지 않기 때문에 payload의 민감한 정보를 담을 수 없습니다. 또한 토큰이 탈취된다면 서버에서 접속을 차단하지 못합니다.
    -> 유효기간을 짧게 둔 AccessToken 과 유효기간을 길게 둔 RefreshToken을 발급하여 해결하곤 합니다.

확장성

  • 세션 기반 인증은 서버의 Scale-Out 시 세션의 불일치가 발생하게 됩니다. 서로 다른 서버의 세션 저장소를 동기화할 수 있는 새로운 세션 저장소가 필요합니다.

  • 토큰 기반 인증은 토큰을 발급하고 검증만 하면 되기 때문에 자유롭게 Scale-Out을 할 수 있습니다.

0개의 댓글