Spring Boot + JWT - DB 기반 권한 관리와 JWT 권한 인증 구현하기

dev.hyjang·2025년 8월 8일

지난 글에서 JWT를 이용한 기본 로그인과 토큰 발급, 그리고 인증 과정까지 구현했습니다.
이번 글에서는 사용자 권한(Role) 정보를 DB에서 관리하고, JWT 토큰에 권한 정보를 포함시켜 Spring Security에서 권한별 API 접근 제어를 구현하는 방법을 다뤄보겠습니다.


1. 사용자 권한 정보(DB 컬럼) 추가하기

JWT 권한 인증을 위해선 토큰에 권한 정보가 포함되어야 합니다.
그래서 기존 사용자 테이블에 권한을 저장하는 컬럼을 추가했습니다.

예를 들어, 다음과 같이 두 사용자 계정을 준비했습니다:

user_idpasswordrole
testuser(암호화된 비밀번호)ROLE_USER
testadmin(암호화된 비밀번호)ROLE_ADMIN

권한은 반드시 ROLE_ 접두사가 붙는 형태로 저장하거나, 애플리케이션 코드에서 접두사를 붙여 일관성 있게 관리하는 것이 중요합니다.


2. 로그인 시 권한 정보를 포함한 JWT 토큰 발급

AuthController에서 로그인 성공 후, DB에서 권한 정보를 읽어 JWT 토큰에 포함시켰습니다.

String role = userService.getRoleByUserId(userId); // DB에서 권한 조회
String roleClaim = role.startsWith("ROLE_") ? role : "ROLE_" + role;
String token = jwtTokenProvider.createToken(userId, roleClaim);

이렇게 발급된 토큰은 내부에 role 클레임을 포함하고 있으며, 클라이언트는 이 토큰을 API 요청 시 헤더에 담아 전송합니다.

3. JWT 토큰에서 권한 정보 파싱 및 SecurityContext에 권한 부여

JwtAuthenticationFilter에서 요청 헤더의 토큰을 꺼내 검증하고,
토큰의 role 클레임을 추출해 SimpleGrantedAuthority 리스트로 변환합니다.

String role = jwtTokenProvider.getUserRole(token);
List<SimpleGrantedAuthority> authorities = Collections.singletonList(new SimpleGrantedAuthority(role));

UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userId, null, authorities);
SecurityContextHolder.getContext().setAuthentication(authentication);

이 과정을 통해 Spring Security가 현재 요청 사용자의 권한을 인식할 수 있게 됩니다.

4. SecurityFilterChain에서 권한별 API 접근 제한 설정

SecurityConfig에서는 다음과 같이 경로별 권한을 제한합니다.

java .authorizeHttpRequests(auth -> auth .requestMatchers("/api/admin/**").hasRole("ADMIN") .requestMatchers("/api/user/**").hasAnyRole("USER", "ADMIN") .anyRequest().authenticated() )

즉, /api/admin/ 경로는 ADMIN 권한을 가진 사용자만 접근 가능하고,
/api/user/
경로는 USER 권한 또는 ADMIN 권한 사용자 모두 접근 가능합니다.

5. Postman으로 권한별 API 호출 테스트하기

  • 로그인 : /api/login에 ID, PW 전송 → 토큰 수신
  • USER 권한 테스트 : /api/user/test 호출 → 정상 접근(200 OK)
  • ADMIN 권한 테스트 : /api/admin/test 호출 → USER 권한이면 403 Forbidden, ADMIN 권한이면 200 OK
  • 토큰 미포함 요청 : 401 Unauthorized 또는 403 Forbidden

마무리

이번 글에서는 DB에 권한 정보를 추가하고 JWT 토큰에 권한을 포함하여, Spring Security와 연동해 권한별 API 접근 제어를 구현하는 방법을 살펴봤습니다.
다음 글에서는 Refresh Token 구현과 토큰 만료 시 자동 갱신 방법, 로그아웃 처리 등을 다룰 예정입니다.

profile
낭만감자

0개의 댓글