-
Notifications
You must be signed in to change notification settings - Fork 3
Domain Auth
moon edited this page Jul 23, 2025
·
4 revisions
개요
Auth 도메인은 멋쟁이 뉴스 배달부 서비스의 사용자 인증 및 권한 관리를 담당하는 핵심 도메인입니다. 카카오 OAuth2 소셜 로그인을 기반으로 하며, JWT 토큰을 활용한 안전한 인증 시스템을 제공합니다.
본 도메인은 카카오 OAuth2 로그인, JWT 토큰 기반 인증, Redis 이중화를 핵심으로 합니다.
📁 Auth
├── controller
│ └── AuthController.java
├── dto
│ ├── AuthResponseDTO.java
│ └── UserInfoDTO.java
├── entity
│ ├── Auth.java
│ └── User.java
├── exception
│ └── AuthException.java
├── repository
│ ├── AuthRepository.java
│ └── UserRepository.java
├── service
│ ├── AuthService.java
│ ├── CustomOAuth2UserService.java
│ ├── KakaoTokenProvider.java
│ └── RedisService.java
├── security
│ ├── JwtAuthenticationFilter.java
│ ├── JwtTokenProvider.java
│ ├── OAuth2LoginSuccessHandler.java
│ └── SecurityConfig.java
└── config
└── OAuth2Config.java
계층별 책임 설명
- controller: 인증 관련 API 요청을 받고 응답을 처리합니다.
- service: 핵심 인증 비즈니스 로직 (OAuth2, JWT, Redis 관리 등)을 담당합니다.
- repository: 사용자 및 인증 정보 DB 조회/저장을 처리하는 JPA 인터페이스입니다.
- entity: User와 Auth 테이블과 매핑되는 핵심 모델입니다.
- dto: API 응답 및 사용자 정보 전송 객체입니다.
- security: JWT 토큰 처리 및 Spring Security 설정을 담당합니다.
- exception: 인증 도메인 전용 예외 처리 로직을 담당합니다.
| 기능 | 설명 |
|---|---|
| 카카오 OAuth2 로그인 | 카카오 소셜 로그인만을 허용하여 일관된 사용자 경험 제공 |
| JWT 토큰 관리 | 액세스 토큰(16분)과 리프레시 토큰(24시간)을 통한 보안 강화 |
| Redis 이중화 | Primary + Backup Redis를 통한 토큰 저장소의 안정성 확보 |
| 자동 토큰 갱신 | 리프레시 토큰을 통한 seamless한 토큰 갱신 |
| 카카오 API 연동 | 저장된 리프레시 토큰으로 카카오 액세스 토큰 관리 |
- 카카오 OAuth2 제공자를 통한 소셜 로그인 처리
- 카카오 사용자 정보 추출 및 Spring Security 인증 객체 생성
- ROLE_USER 권한 자동 부여
관련 클래스: CustomOAuth2UserService, OAuth2LoginSuccessHandler
- 액세스 토큰: 16분 유효기간, API 요청 인증용
- 리프레시 토큰: 24시간 유효기간, 토큰 갱신용
- HMAC SHA-256: 토큰 서명 알고리즘
- 토큰 유효성 검증: 서명, 만료시간, 형식 검증
관련 클래스: JwtTokenProvider
// 이중화된 Redis 인스턴스 활용
Primary Redis (주 저장소) + Backup Redis (백업 저장소)
- 자동 Failover 지원
- 토큰별 만료시간 자동 관리
- 로그아웃 시 토큰 완전 삭제관련 클래스: RedisService
// 카카오 OAuth2를 통한 사용자 정보 관리
- 카카오 ID 기반 사용자 식별
- 회원가입 시점 자동 기록
- 사용자별 고유 식별자 제공// 카카오 리프레시 토큰 저장 및 관리
- 카카오 API 호출을 위한 리프레시 토큰 보관
- 사용자와 1:1 관계 매핑
- 토큰 만료 시 자동 갱신 지원토큰 관리
POST /api/auth/refresh
- JWT 토큰 갱신
POST /api/auth/logout
- 사용자 로그아웃 및 토큰 무효화
사용자 정보
GET /api/auth/me
- 현재 사용자 정보 조회
GET /api/auth/status
- 로그인 상태 확인
모든 HTTP 요청에 대한 JWT 인증 처리:
- Authorization 헤더에서 Bearer 토큰 추출
- JWT 토큰 유효성 검증
- 토큰에서 사용자 정보 추출
- SecurityContext에 인증 정보 설정
관련 클래스: JwtAuthenticationFilter
카카오 액세스 토큰 관리:
- 저장된 리프레시 토큰으로 액세스 토큰 발급
- 카카오 API 호출을 위한 유효한 토큰 제공
- 토큰 만료 시 자동 갱신
- 토큰 유효성 검증
관련 클래스: KakaoTokenProvider
Spring Security 설정:
- CSRF 비활성화 (JWT 사용으로 인한)
- CORS 설정
- 세션 무상태 설정 (STATELESS)
- OAuth2 로그인 설정
- JWT 필터 체인 구성
관련 클래스: SecurityConfig
1. 사용자 → 카카오 로그인 요청
2. 카카오 → 인증 완료 후 코드 반환
3. 서버 → 카카오 토큰 교환 및 사용자 정보 획득
4. 서버 → User/Auth 테이블에 정보 저장
5. 서버 → JWT 토큰 생성 및 Redis 저장
6. 클라이언트 → 토큰 정보 수신 및 저장
1. 클라이언트 → Authorization 헤더에 JWT 토큰 포함하여 요청
2. JwtAuthenticationFilter → 토큰 추출 및 검증
3. 유효한 경우 → SecurityContext에 인증 정보 설정
4. 컨트롤러 → 인증된 사용자로 비즈니스 로직 처리
1. 클라이언트 → 리프레시 토큰으로 갱신 요청
2. 서버 → Redis에서 토큰 유효성 검증
3. 서버 → 새로운 액세스 토큰 발급
4. 서버 → Redis에 새 토큰 저장
5. 클라이언트 → 새로운 토큰 수신
// 체계적인 에러 코드 관리
- AUTH_ERROR_6xx: 인증 관련 예외
- 사용자 친화적 에러 메시지
- HTTP 상태 코드와 매핑
- GlobalExceptionHandler를 통한 일관된 예외 처리주요 예외 상황
- JWT 토큰 만료 또는 무효
- 카카오 API 호출 실패
- Redis 연결 오류
- 사용자 정보 불일치
- 단일 로그인 방식: 카카오 OAuth2만 지원하여 통합된 사용자 경험 제공
- 무상태 인증: JWT 기반으로 서버 세션에 의존하지 않는 확장 가능한 구조
- 보안 강화: 토큰 이중화 및 자동 만료 처리로 보안성 향상
- 자동 갱신: 사용자 개입 없이 토큰 자동 갱신으로 끊김 없는 서비스 제공
- Spring Security: 인증 및 권한 관리 프레임워크
- OAuth2 Client: 카카오 소셜 로그인 연동
- JWT (JJWT): 토큰 기반 인증 라이브러리
- Redis: 토큰 저장소 (이중화 구성)
- JPA/Hibernate: 사용자 정보 영속성 관리
- Spring Boot: 전체 애플리케이션 프레임워크