Skip to content

Domain Auth

moon edited this page Jul 23, 2025 · 4 revisions

🔐Auth

개요

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: 인증 도메인 전용 예외 처리 로직을 담당합니다.

역할 및 책임 (Responsibility)

기능 설명
카카오 OAuth2 로그인 카카오 소셜 로그인만을 허용하여 일관된 사용자 경험 제공
JWT 토큰 관리 액세스 토큰(16분)과 리프레시 토큰(24시간)을 통한 보안 강화
Redis 이중화 Primary + Backup Redis를 통한 토큰 저장소의 안정성 확보
자동 토큰 갱신 리프레시 토큰을 통한 seamless한 토큰 갱신
카카오 API 연동 저장된 리프레시 토큰으로 카카오 액세스 토큰 관리

기능 설명

1. 카카오 OAuth2 로그인 플로우

  • 카카오 OAuth2 제공자를 통한 소셜 로그인 처리
  • 카카오 사용자 정보 추출 및 Spring Security 인증 객체 생성
  • ROLE_USER 권한 자동 부여

관련 클래스: CustomOAuth2UserService, OAuth2LoginSuccessHandler

2. JWT 토큰 시스템

토큰 생성 및 검증

  • 액세스 토큰: 16분 유효기간, API 요청 인증용
  • 리프레시 토큰: 24시간 유효기간, 토큰 갱신용
  • HMAC SHA-256: 토큰 서명 알고리즘
  • 토큰 유효성 검증: 서명, 만료시간, 형식 검증

관련 클래스: JwtTokenProvider

Redis 토큰 저장소

// 이중화된 Redis 인스턴스 활용
Primary Redis ( 저장소) + Backup Redis (백업 저장소)
- 자동 Failover 지원
- 토큰별 만료시간 자동 관리
- 로그아웃  토큰 완전 삭제

관련 클래스: RedisService

3. 사용자 및 인증 정보 관리

User Entity

// 카카오 OAuth2를 통한 사용자 정보 관리
- 카카오 ID 기반 사용자 식별
- 회원가입 시점 자동 기록
- 사용자별 고유 식별자 제공

Auth Entity

// 카카오 리프레시 토큰 저장 및 관리
- 카카오 API 호출을 위한 리프레시 토큰 보관
- 사용자와 1:1 관계 매핑
- 토큰 만료  자동 갱신 지원

4. REST API 엔드포인트

토큰 관리

POST /api/auth/refresh
  • JWT 토큰 갱신
POST /api/auth/logout
  • 사용자 로그아웃 및 토큰 무효화

사용자 정보

GET /api/auth/me
  • 현재 사용자 정보 조회
GET /api/auth/status
  • 로그인 상태 확인

5. 인증 필터 시스템

모든 HTTP 요청에 대한 JWT 인증 처리:

  1. Authorization 헤더에서 Bearer 토큰 추출
  2. JWT 토큰 유효성 검증
  3. 토큰에서 사용자 정보 추출
  4. SecurityContext에 인증 정보 설정

관련 클래스: JwtAuthenticationFilter

6. 카카오 API 연동

카카오 액세스 토큰 관리:

  • 저장된 리프레시 토큰으로 액세스 토큰 발급
  • 카카오 API 호출을 위한 유효한 토큰 제공
  • 토큰 만료 시 자동 갱신
  • 토큰 유효성 검증

관련 클래스: KakaoTokenProvider

7. 보안 설정

Spring Security 설정:

  • CSRF 비활성화 (JWT 사용으로 인한)
  • CORS 설정
  • 세션 무상태 설정 (STATELESS)
  • OAuth2 로그인 설정
  • JWT 필터 체인 구성

관련 클래스: SecurityConfig

데이터 플로우

로그인 플로우

1. 사용자 → 카카오 로그인 요청
2. 카카오 → 인증 완료 후 코드 반환
3. 서버 → 카카오 토큰 교환 및 사용자 정보 획득
4. 서버 → User/Auth 테이블에 정보 저장
5. 서버 → JWT 토큰 생성 및 Redis 저장
6. 클라이언트 → 토큰 정보 수신 및 저장

API 요청 플로우

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: 전체 애플리케이션 프레임워크

Clone this wiki locally