어떤 기능인가요?
gateway:auth 모듈에 Spring Security + JJWT 기반 JWT 인증 필터를 구현한다. Access Token 발급·검증 경로를 세워, 이후 모든 API가 SecurityContextHolder 기반 인증 컨텍스트 위에서 동작하도록 한다.
현재 gateway:auth는 build.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()가 통과한다
📝 작업 상세 내용
이번 범위에서 제외
- 로그인 API 및
core:domain:auth 인증 도메인 로직
- Refresh Token / 토큰 재발급 / 로그아웃
CouncilDepartmentAccessChecker
api:common-api의 ApiResponse·GlobalExceptionHandler·ApiUser
- DB 스키마 변경
📁 참고 자료
설계 결정
- Java 패키지는
kr.ac.kookmin.stream.security — core:domain:auth가 쓸 ...stream.auth와 겹치면 Modulith가 두 모듈을 하나로 인식한다
SecurityConfig는 gateway:auth에 둔다 (config-and-auth.md 4-5절 기준)
- 학생회 부서 enum은
CouncilDepartment — member 도메인이 학부 구분(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절 — 모듈 의존 방향
어떤 기능인가요?
gateway:auth모듈에 Spring Security + JJWT 기반 JWT 인증 필터를 구현한다. Access Token 발급·검증 경로를 세워, 이후 모든 API가SecurityContextHolder기반 인증 컨텍스트 위에서 동작하도록 한다.현재
gateway:auth는build.gradle.kts만 있고 소스가 없으며,core:common에도 인증 추상(Role/CouncilDepartment/PrincipalProvider)이 없어 함께 추가한다.완료 기준
Authorization: Bearer <token>요청이 필터를 통과하면SecurityContextHolder에 userId + 권한(ADMIN/STUDENT+COUNCIL_*)이 채워지고PrincipalProvider로 조회된다/v1/admin/**→ ADMIN,/v1/app/**→ STUDENT)가 동작한다HandlerExceptionResolver로 위임된다ModularityTests.verify()가 통과한다📝 작업 상세 내용
core:common인증 추상 추가 —Role(STUDENT/ADMIN),CouncilDepartment(8개 부서),PrincipalProviderapplication-gateway-auth.yml, 루트.env.example,bootstrap의spring.config.import·@ConfigurationPropertiesScan,JwtPropertiesJwtProvider— HS256 Access Token 발급 + 파싱·검증UserAuthentication+JwtAuthFilter+SecurityPrincipalProviderSecurityConfig—SecurityFilterChain, URL 패턴별 인가, 인증 실패 예외 위임이번 범위에서 제외
core:domain:auth인증 도메인 로직CouncilDepartmentAccessCheckerapi:common-api의ApiResponse·GlobalExceptionHandler·ApiUser📁 참고 자료
설계 결정
kr.ac.kookmin.stream.security—core:domain:auth가 쓸...stream.auth와 겹치면 Modulith가 두 모듈을 하나로 인식한다SecurityConfig는gateway:auth에 둔다 (config-and-auth.md4-5절 기준)CouncilDepartment—member도메인이 학부 구분(SW/AI)에Department를 쓰기로 해 어휘를 분리했다. JWT claim은council, authority 접두사는COUNCIL_HandlerExceptionResolver에 위임 (architecture.md7절)토큰 claim
subroles["STUDENT", "ADMIN"]— 학생회 임원은 겸직 가능council["WELFARE"]— ADMIN을 가진 사용자만 채워진다부서 8개
PRESIDENCY(회장단),EXECUTIVE(집행부),GENERAL_AFFAIRS(총무부),PLANNING(기획부),PR(홍보부),MEDIA(미디어부),WELFARE(복지부),COMMUNICATION(소통부)컨벤션 문서
docs/conventions/config-and-auth.md— 권한 모델, 인증 흐름docs/conventions/architecture.md3·7절 — 모듈 의존 방향