Token, Access Token & Refresh Token
기본 JWT 방식의 인증(보안)을 강화하는 방법인 Access Token & Refresh Token을 살펴보기 전에, 서버가 클라이언트를 인증하는 방식과 JWT(Json Web Token)에 대한 이해가 필요하다.
클라이언트 인증 방식
인증은 클라이언트(사용자)가 자신이 주장하는 신원을 확인하는 과정을 말한다. 이는 보안의 첫 번째 단계로, 사용자가 시스템에 접근하기 전에 그 신원을 검증하는 데 사용된다.
인증과 인가의 차이
- 인증(Authentication): 사용자가 누구인지 확인하는 과정. 클라이언트가 주장하는 신원이 실제로 맞는지 확인하여 신뢰성을 확보.
- 인가(Authorization): 인증된 사용자가 어떤 작업을 수행할 수 있는지를 결정하는 과정. 사용자가 특정 자원이나 기능에 접근할 수 있는 권한이 있는지를 검사.
즉, 인증은 클라이언트의 신원을 검증하고, 인가는 해당 신원을 가진 클라이언트가 시스템에서 어떤 작업을 수행할 수 있는지를 결정한다.
서버가 클라이언트 인증을 확인하는 방식은 대표적으로 쿠키, 세션, 토큰 3가지 방식이 있다.
쿠키(Cookie)
웹 브라우저가 웹 서버와 상호 작용할 때 주고받는 작은 데이터 조각으로, Key-Value 형식의 문자열 덩어리다.
클라이언트가 특정 웹사이트를 방문하면, 그 사이트의 서버가 클라이언트의 브라우저에 쿠키를 설치한다. 이 쿠키는 클라이언트 측에 저장되어 이후에 같은 사이트를 방문할 때 다시 서버로 전송되어 고유 정보 식별을 할 수 있다.
구조
위에서 말했듯, 쿠키는 Key-Value 쌍으로 구성된다. 예를 들어, ‘userId=12345’와 같은 형태이다.
또한 쿠키는 다양한 속성이 포함될 수 있다. 주요 속성은 다음과 같다:
- Name: 쿠키의 이름
- Value: 쿠키에 저장된 값
- Domain: 쿠키가 유효한 도메인
- Path: 쿠키가 유효한 URL 경로
- Expires 또는 Max-Age: 쿠키의 유효 기간
- Secure: HTTPS 연결에서만 전송됨
- HttpOnly: JavaScript로 접근할 수 없도록 설정
동작 원리
클라이언트가 웹사이트에 처음 방문하면, 서버는 응답 헤더에 ‘Set-Cookie’ 명령을 포함하여 쿠키를 전송한다. 이때 서버는 클라이언트 측에 저장하고 싶은 정보를 응답 헤더의 Set-Cookie에 담는다. 브라우저는 쿠키를 로컬 저장소에 저장힌다.
이후 클라이언트가 요청을 보낼 때마다, 웹 브라우저는 저장된 쿠키를 요청 헤더의 ‘Cookie’ 필드에 포함시켜 서버로 전송한다. 서버는 쿠키에 담긴 정보를 바탕으로 해당 요청을 보낸 클라이언트를 식별하고, 로그인 상태 유지, 사용자 맞춤 설정 적용 등 필요한 기능을 제공한다. 예를 들어, 특정 팝업을 사용자에게 맞춤형으로 표시할 수 있다.
서버는 필요에 따라 쿠키의 값을 갱신하거나 삭제할 수 있다. 브라우저는 쿠키의 유효 기간이 만료되면 자동으로 쿠키를 삭제한다.
쿠키의 활용
아래는 예시.
- 세션 관리
- 로그인 상태 유지: 사용자가 로그인을 하면 세션 ID를 쿠키에 저장하여 재방문 시 로그인 상태 유지 가능
- 개인화
- 사용자 맞춤 설정: 사용자 선호도나 설정을 저장하여 개인 맞춤형 서비스 제공 가능 (ex. 7일간 보지 않기)
- 트래킹 및 분석
- 트래킹: 사용자의 행동을 기록하고 분석하는 용도로 사용된다. 트래킹 쿠키는 방문한 사이트가 아닌 다른 도메인으로도 데이터를 전송할 수 있다. 예를 들어, 광고 네트워크는 사용자가 특정 웹사이트에서 본 상품을 추적하여 관련 광고를 다른 웹사이트에서도 표시할 수 있다. 사용자가 웹사이트 A에서 신발을 본 경우, 해당 정보는 쿠키를 통해 저장되어 사용자가 웹사이트 B를 방문할 때 신발 광고를 보여주는 데 활용된다. 이러한 트래킹 데이터는 사용자 경험을 개인화하고 광고 효율성을 높이는 데 사용된다.
쿠키의 종류
세션 쿠키: 웹 브라우저를 닫을 때 삭제되는 일시적인 쿠키
지속 쿠키: 만료 날짜까지 사용자의 기기에 저장되는 쿠키
제3자 쿠키(Third-Party CooKie): 사용자가 방문하는 웹사이트 이외의 도메인에서 설정된 쿠키로, 웹사이트의 통계, 광고 제공, 사용자 행동 분석 등의 목적을 가진 쿠키
세션 쿠키와 지속 쿠키의 주요 차이점은 파기 시점이다. 쿠키에 Expires 또는 Max-Age 파라미터가 설정되어 있으면, 그 쿠키는 세션 쿠키로 간주된다.
- expires (만료일이 되면 쿠키 삭제)
- Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT
- max-ages (지정 시간이 지나면 쿠키 삭제)
- Set-Cookie: max-age=3600 (3600초)
쿠키의 단점
- 보안 취약: 쿠키가 해커에 의해 탈취되면 사용자의 로그인 정보나 개인 데이터가 유출될 수 있다.
- 저장 공간 제한: 각 도메인당 저장할 수 있는 쿠키의 크기와 수가 제한되어 있어, 대용량 데이터 저장에 적합하지 않다. (약 4kb, 20개)
세션(Session)
서버에서 관리되는 고유 식별자를 통해 사용자 정보를 유지하는 방법으로, 세션 ID가 클라이언트와 서버 간에 주고받는다.
클라이언트가 웹사이트에 접속하면 서버는 세션 ID를 생성하여 클라이언트에게 전달하고, 서버는 해당 ID와 연결된 데이터를 저장한다. 이후 클라이언트는 서버에 요청을 보낼 때 이 세션 ID를 함께 전송하여 서버가 사용자 상태를 유지할 수 있게 한다. 세션 데이터는 서버에 저장되므로 보안성이 높고, 보통 일정 시간이 지나면 자동으로 만료된다.
Access Token & Refresh Token
액세스 토큰과 리프레시 토큰은 주로 OAuth 2.0 인증 프로토콜에서 사용되는 두 가지 중요한 토큰이다.
OAuth 2.0 인증 프로토콜은 클라이언트 앱이 자원의 소유자를 대신하여 리소스 서버에 안전하게 접근할 수 있도록 권한을 위임하는 표준화된 프레임워크다. 이를 통해 사용자 자격 증명을 노출하지 않고도 서비스 간 인증과 권한 부여를 관리할 수 있다.
액세스 토큰 (Access Token):
- 목적: 리소스 서버에 접근할 수 있는 권한을 부여하는 토큰
- 특징: 유효 기간이 짧다 (보통 몇 분에서 몇 시간)
- 리소스 서버에 인증을 위해 전송
- 권한이 부여된 리소스에 접근할 때 사용
리프레시 토큰 (Refresh Token):
- 목적: 새로운 액세스 토큰을 발급받기 위한 토큰
- 특징: 유효 기간이 길거나 만료되지 않을 수 있다
- 클라이언트가 액세스 토큰을 갱신할 때 사용
- 직접 리소스 서버에 접근하지 않음
이 두 토큰은 함께 사용되어, 보안성을 높이고 사용자 경험을 개선한다. 액세스 토큰의 짧은 유효 기간은 보안을 강화하고, 리프레시 토큰은 사용자가 다시 로그인하지 않고도 지속적으로 서비스를 이용할 수 있게 한다.