기타

로그인 방식 정리 ( Access Token과 Refresh Token(feat. session) )

KimYHG 2025. 3. 4. 04:26

1. Token 이란?

토큰은 사용자의 신원을 확인하는 프로세스를 수행하거나 

사용자에게 작업 수행 권한을 부여하는 데 

충분한 정보가 포함된 데이터 조각입니다.

Tokens are pieces of data with just enough information
 to carry out the process of determining a user's identity,

  or authorizing a user to perform an action.

 

2. 사용자 인증

사용자 인증은 시스템이나 애플리케이션에 접근하려는 사용자를 확인하는 과정

 

인증은 여러 관점에서 분류를 할 수 있다. 

그 중에서 인증 상태를 관리하는 방식으로 나누면 크게 세션 기반토큰 기반으로 나뉜다.

어떤 방식으로 사용자 인증을 유지하고, 관리하는지에 따라 다양한 전략이 존재한다.

 

1) 인증 상태 관리 방식에 따른 분류

상태 기반 인증 ( Stateful Authentication )

서버가 사용자의 로그인 상태(Session) 를 유지하는 방식, 서버에 로그인 정보를 저장

Session 기반 인증이 대표적

서버가 로그인 상태를 저장하고 관리 => 관리 주체 : 서버

서버가 세션 ID 를 생성해서 클라이언트에게 주면 클라이언트는 세션 ID (일반적으로 쿠키)를 사용하여 인증 요청

문제 : 서버 확장성 문제, CORS 이슈,  서버 다운되면 모든 서비스 접속 불가, scale out시 서버끼리 데이터 불일치 가

 

무상태 기반 인증 ( Stateless Authentication )

서버가 로그인 상태를 유지하지 않으며,  => 로그인 정보를 저장하지 않음(Session을 기억하지 않음)

클라이언트가 인증 정보를 직접 보관하고 전달하는 방식

토큰 기반 인증이 대표적

서버에 사용자 로그인 정보를 저장하지 않고, 매 요청마다 토큰을 검증하여 사용자 인증

쿠키 대신 HTTP 헤더를 사용하여 CORS 문제 없음

문제 : 토큰 탈취 시 보안 문제, 토큰 무효화 어려움(로그아웃 후에도 토큰 살아있음, 강제 로그아웃하려면 블랙리스트 관리필요)

대표사용 : 모바일 앱 인증(OAuth2.0), MSA 환경

 

2) 인증 유지 방식에 따른 분류

세션 쿠키 ( Session Cookie )

클라이언트의 쿠키에 서버가 생성한 세션 ID를 저장하여 인증을 유지하는 방식

 

로컬 저장소 ( Local Storage )

클라이언트가 브라우저의 로컬 스토리지 (Local Storage ) 나 세션 스토리지 ( Session Storage ) 에 토큰을 저장하여 인증을 유지

확장성 높음

CORS 문제 없음 ( 헤더에 토큰을 넣어 요청 )

문제 : XSS 공격에 취약 ( 스크립트 공격으로 토큰을 탈취할 수 있음 ), 로그아웃 시 스토리지에서 직접 삭제해야하는 관리 필요

 

HTTP Only 쿠키 ( Secure Cookie )

HttpOnly 속성이 적용된 쿠키에 토큰을 저장하여 인증 유지

HttpOnly 속성이 있으면 JavaScript에서 접근이 불가하여 XSS 공격 방어 가능

문제 : CORS 설정 필요, 

 

3) 인증 연장 방식 (Token Refresh Strategy)

엑세스 토큰 + 리프레시 토큰 ( Access Token + Refresh Token )

엑세스 토큰 : 사용자가 서비스에 접근할 수 있는 사용자에 대한 정보를 담고 있음

리프레시 토큰 : 그 자체로는 별다른 정보를 담고 있지 않음.
    엑세스 토큰이 만료되었을 경우 서버에서 이를 확인하고 새로운 엑세스 토큰을 발급해주는 역할

짧은 수명의 엑세스 토큰과 긴 수명의 리프레시 토큰을 사용하여 인증을 지속

로그인 유지 기능

리프레시 토큰은 보안상 쿠키(HttpOnly)나 DB에 저장

문제점 : 리프레시 토큰 보관 주의

사용 예시 : OAuth 2.0 기반 인증, JWT 기반 서비스

 

 

3. 토큰 기반 인증

1) Access Token ( Token 1개 사용 ) - JWT로 사용

  • JWT( 2025.03.04 - [기타] - JWT 이론 정리 )는 Stateless => 서버에서 토큰의 상태를 제어할 수 없다.
  • 한계 : 외부 공격자가 토큰을 탈취하면 토큰이 만료될 때까지 속수무책이다. => 외부 접속인지 확인할 수 없다.

2) Access Token + Refresh Token ( Token 2개 사용 )

  • 리프레시 토큰은 그 자체로는 사용자 정보를 담고 있지 않아서 꼭 JWT 토큰을 사용하지 않아도 된다. JWT를 사용하지 않을 경우 저장하는 위치에 expiration값을 추가하면 된다.
  • 리프레시 토큰은 서버의 DB에 저장하기도 한다 => stateleful 해진다. (사용자 인증 정보가 없다고 생각해서 처음에는 인증에 직접적인 관계가 아니어서 stateless이나 stateful한지 여부와 무관하다고 생각했다.)
  • 엑세스 토큰의 유효시간을 짧게 설정할 수 있고 리프레시 토큰에 사용자의 정보를 가지고 있지 않아서 상대적으로 안전하다. 또한 더 다양한 방법으로 부족한 부분을 해결할 수 있다.

 

 

4. 구현 ( Access Token + Refresh Token )