본문 바로가기

Spring Boot/Security 토큰 기반 인증,인가

토큰 기반 인증의 개념, 필요성 : 토큰 기반 인증이 적합한 상황

 - 토큰 기반 인증이 사용되기에 적합한 실제 상황들

 - RESTful API 설계와 토큰 기반 인증의 관계

 - 마이크로서비스 아키텍처에서 토큰 인증이 필수적인 이유

 - SPA 클라이언트와 토큰 인증의 자연스러운 연결성

 - 모바일 애플리케이션 환경에서 세션 기반 인증의 한계를 극복하는 방법


토큰 기반 인증이 적합한 상황

토큰 기반 인증은 단순히 "세션 기반 인증을 대체한다" 라는 특징을 넘어,
특정한 아키텍처나 애플리케이션 환경에서 반드시 필요하게 된다

 

1. RESTful API 설계와 토큰 인증

RESTful API는 무상태성(stateless) 원칙을 따르는게 핵심이다

서버는 클라이언트 상태를 보관하지 않고, 요청에 필요한 모든 정보는 클라이언트가 직접 전달해야한다

이 때 토큰 기반 인증은 각 요청에 토큰을 포함시켜, 서버가 상태를 보관하지 않더라도 인증과 인가를 처리할 수 있게 해준다

 

사실, 이 시점에서 클라이언트(브라우저)는 무상태성이라고 보기엔 사용자 입장에선 보기 힘들 수 있다..

 

서버가 클라이언트에게 JWT 토큰을 발급하고, 이후 요청마다 헤더에 토큰을 포함한다

 

 

REST API 요청 예

# 로그인 후 받은 토큰을 Authorization 헤더에 포함한다
curl -H "Authorization: Bearer <JWT_TOKEN>" \\
	<https://api.example.com/users>

 

 

 

2. 마이크로서비스 아키텍처와 토큰 인증

마이크로서비스 아키텍처에서는 수많은 독립 서비스가 서로 통신한다

 

세션 기반 인증은 중앙 세션 저장소가 필요해서 관리가 복잡해지고, 서비스간 확장이 어렵다

토큰 기반 인증은 Self-Contained 특성 덕분에 각 서비스가 동일한 토큰을 검증해 인증을 독립적으로 처리할 수 있다

사용자가 JWT를 포함한 요청에 대해 서버는 토큰을 검증만 하면 된다

 

 

 

3. SPA(Single Page Application) 와 토큰 인증

Single Page Application 은 브라우저에서 실행되며, 백엔드와 REST API 혹은 GraphQL 로 통신한다

 

세션 쿠키를 사용하면 CSRF 방어와 SameSite 설정 등 복잡한 관리가 필요하다

반면, 토큰 기반 인증은 로컬 스토리지나 세션 스토리지에 저장 후, 요청시마다 헤더에 직접 추가하여 더욱 직관적으로 동작한다

 

React 클라이언트 예

// 로그인 성공 후 토큰을 저장함
localStorage.setItem("token", response.data.token);

// API 요청시 헤더에 토큰을 추가한다
axios.get("/api/users", {
	headers: {
    	Authorization: 'Bearer ${localStorage.getItem("token")}'
    }
});

 

 

 

 

4. 모바일 애플리케이션과 토큰 인증

모바일 앱은 다양한 네트워크 환경(와이파이, LTE 등)에서 실행된다

 

세션 기반 인증 방식은 연결이 끊어지면 인증 상태가 유지되지 않는 문제가 있다

토큰 기반 인증 방식은 클라이언트단에서 보관 후, 요청마다 재사용할 수 있으므로 모바일 환경에 더욱 적합하다고 볼 수 있음

 

 

워크플로우 다이어그램

로그인 요청에 대해 인증 서버가 토큰을 발급하고, API 요청 시 토큰을 헤더에 담아서 보낸다

 

 

 

  • 토큰은 보통 HTTP 헤더(Authorization: Bearer) 에 실어서 전송한다
  • 로컬 스토리지에 저장할 경우 XSS의 위험이 있으므로, 모바일 앱은 안전한 키체인 / 보안 스토리지를 활용하는게 좋다
  • 마이크로서비스 환경에서는 중앙 인증 서버(Identity Provider) 를 두고 토큰 발급과 검증을 일원화하는 구조를 많이 사용한다고 함

상황 세션 기반 인증의 한계 토큰 기반 인증의 장점
RESTful API 상태 저장 필요 - > 서버 확장성 저하 Stateless 요청 처리 가능
마이크로서비스 중앙 세션 공유가 어려움 각 서비스 독립적으로 토큰을 검증
SPA(Single Page Application) CSRF 방어 필요, 쿠키 관리가 복잡함 토큰을 직접 관리하여 단순화함
모바일 앱 네트워크 환경에 따라 세션이 불안정 토큰 저장 후 재사용으로 안정적임