Skip to content

JWT 기반 인증 필터 구현 #5

Description

@tnals0924

어떤 기능인가요?

gateway:auth 모듈에 Spring Security + JJWT 기반 JWT 인증 필터를 구현한다. Access Token 발급·검증 경로를 세워, 이후 모든 API가 SecurityContextHolder 기반 인증 컨텍스트 위에서 동작하도록 한다.

현재 gateway:authbuild.gradle.kts만 있고 소스가 없으며, core:common에도 인증 추상(Role/CouncilDepartment/PrincipalProvider)이 없어 함께 추가한다.

완료 기준

  • Authorization: Bearer <token> 요청이 필터를 통과하면 SecurityContextHolder에 userId + 권한(ADMIN/STUDENT + COUNCIL_*)이 채워지고 PrincipalProvider로 조회된다
  • URL 패턴 인가(/v1/admin/** → ADMIN, /v1/app/** → STUDENT)가 동작한다
  • 토큰 없음·만료·서명 불일치 시 401/403이 나가고 예외는 HandlerExceptionResolver로 위임된다
  • ModularityTests.verify()가 통과한다

📝 작업 상세 내용

  • core:common 인증 추상 추가 — Role(STUDENT/ADMIN), CouncilDepartment(8개 부서), PrincipalProvider
  • 설정 골격 — application-gateway-auth.yml, 루트 .env.example, bootstrapspring.config.import·@ConfigurationPropertiesScan, JwtProperties
  • JwtProvider — HS256 Access Token 발급 + 파싱·검증
  • UserAuthentication + JwtAuthFilter + SecurityPrincipalProvider
  • SecurityConfigSecurityFilterChain, URL 패턴별 인가, 인증 실패 예외 위임

이번 범위에서 제외

  • 로그인 API 및 core:domain:auth 인증 도메인 로직
  • Refresh Token / 토큰 재발급 / 로그아웃
  • CouncilDepartmentAccessChecker
  • api:common-apiApiResponse·GlobalExceptionHandler·ApiUser
  • DB 스키마 변경

📁 참고 자료

설계 결정

  • Java 패키지는 kr.ac.kookmin.stream.securitycore:domain:auth가 쓸 ...stream.auth와 겹치면 Modulith가 두 모듈을 하나로 인식한다
  • SecurityConfiggateway:auth에 둔다 (config-and-auth.md 4-5절 기준)
  • 학생회 부서 enum은 CouncilDepartmentmember 도메인이 학부 구분(SW/AI)에 Department를 쓰기로 해 어휘를 분리했다. JWT claim은 council, authority 접두사는 COUNCIL_
  • 인증 실패 예외는 HandlerExceptionResolver에 위임 (architecture.md 7절)

토큰 claim

Claim
sub userId
roles ["STUDENT", "ADMIN"] — 학생회 임원은 겸직 가능
council ["WELFARE"] — ADMIN을 가진 사용자만 채워진다

부서 8개

PRESIDENCY(회장단), EXECUTIVE(집행부), GENERAL_AFFAIRS(총무부), PLANNING(기획부), PR(홍보부), MEDIA(미디어부), WELFARE(복지부), COMMUNICATION(소통부)

컨벤션 문서

  • docs/conventions/config-and-auth.md — 권한 모델, 인증 흐름
  • docs/conventions/architecture.md 3·7절 — 모듈 의존 방향

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions