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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions