2025-09-09 01:12:14 +09:00

330 lines
7.7 KiB
Markdown

# PhoneBill API Gateway
통신요금 관리 서비스의 API Gateway 모듈입니다.
## 개요
Spring Cloud Gateway를 사용하여 구현된 API Gateway로, 마이크로서비스들의 단일 진입점 역할을 담당합니다.
### 주요 기능
- **JWT 토큰 기반 인증/인가**: 모든 요청에 대한 통합 인증 처리
- **서비스별 라우팅**: 각 마이크로서비스로의 지능형 라우팅
- **Rate Limiting**: Redis 기반 요청 제한
- **Circuit Breaker**: 외부 시스템 장애 격리
- **CORS 설정**: 크로스 오리진 요청 처리
- **API 문서화 통합**: 모든 서비스의 Swagger 문서 통합
- **헬스체크**: 시스템 상태 모니터링
- **Fallback 처리**: 서비스 장애 시 대체 응답
## 기술 스택
- **Java 17**
- **Spring Boot 3.2.1**
- **Spring Cloud Gateway**
- **Spring Data Redis Reactive**
- **JWT (JJWT 0.12.3)**
- **Resilience4j** (Circuit Breaker)
- **SpringDoc OpenAPI 3**
## 아키텍처
### 라우팅 구성
```
/auth/** -> auth-service (인증 서비스)
/bills/** -> bill-service (요금조회 서비스)
/products/** -> product-service (상품변경 서비스)
/kos/** -> kos-mock-service (KOS 목업 서비스)
```
### 패키지 구조
```
com.unicorn.phonebill.gateway/
├── config/ # 설정 클래스
│ ├── GatewayConfig # Gateway 라우팅 설정
│ ├── RedisConfig # Redis 및 Rate Limiting 설정
│ ├── SwaggerConfig # API 문서화 설정
│ └── WebConfig # Web 설정
├── controller/ # 컨트롤러
│ └── HealthController # 헬스체크 API
├── dto/ # 데이터 전송 객체
│ └── TokenValidationResult # JWT 검증 결과
├── exception/ # 예외 클래스
│ └── GatewayException # Gateway 예외
├── filter/ # Gateway 필터
│ └── JwtAuthenticationGatewayFilterFactory # JWT 인증 필터
├── handler/ # 핸들러
│ └── FallbackHandler # Circuit Breaker Fallback 핸들러
├── service/ # 서비스
│ └── JwtTokenService # JWT 토큰 검증 서비스
└── util/ # 유틸리티
└── JwtUtil # JWT 유틸리티
```
## 빌드 및 실행
### 개발 환경
```bash
# 의존성 설치 및 빌드
./gradlew build
# 개발 환경 실행
./gradlew bootRun --args='--spring.profiles.active=dev'
# 또는
./gradlew bootRun -Pdev
```
### 운영 환경
```bash
# 운영용 JAR 빌드
./gradlew bootJar
# 운영 환경 실행
java -jar api-gateway-1.0.0.jar --spring.profiles.active=prod
```
## 환경 설정
### 개발 환경 (application-dev.yml)
- JWT 토큰 유효시간: 1시간 (개발 편의성)
- Redis: localhost:6379
- Rate Limiting: 1000 requests/minute
- Circuit Breaker: 관대한 설정
- Swagger UI: 활성화
### 운영 환경 (application-prod.yml)
- JWT 토큰 유효시간: 30분 (보안 강화)
- Redis: 클러스터 설정
- Rate Limiting: 500 requests/minute
- Circuit Breaker: 엄격한 설정
- Swagger UI: 비활성화
### 환경 변수
운영 환경에서는 다음 환경 변수를 설정해야 합니다:
```bash
JWT_SECRET=your-256-bit-secret-key
REDIS_HOST=redis-cluster.domain.com
REDIS_PASSWORD=your-redis-password
AUTH_SERVICE_URL=https://auth-service.internal.domain.com
BILL_SERVICE_URL=https://bill-service.internal.domain.com
PRODUCT_SERVICE_URL=https://product-service.internal.domain.com
KOS_MOCK_SERVICE_URL=https://kos-mock.internal.domain.com
```
## API 문서
### 개발 환경
Swagger UI는 개발 환경에서만 활성화됩니다:
- **Swagger UI**: http://localhost:8080/swagger-ui.html
- **API Docs**: http://localhost:8080/v3/api-docs
### 헬스체크
- **기본 헬스체크**: `GET /health`
- **상세 헬스체크**: `GET /health/detailed`
- **Actuator 헬스체크**: `GET /actuator/health`
## JWT 인증
### 토큰 형식
```
Authorization: Bearer <JWT_TOKEN>
```
### 토큰 페이로드 예시
```json
{
"sub": "user123",
"role": "USER",
"iat": 1704700800,
"exp": 1704704400,
"jti": "token-unique-id"
}
```
### 인증 제외 경로
- `/auth/login` (로그인)
- `/auth/refresh` (토큰 갱신)
- `/health` (헬스체크)
- `/actuator/health` (Actuator 헬스체크)
## Rate Limiting
### 제한 정책
- **일반 사용자**: 100 requests/minute
- **VIP 사용자**: 500 requests/minute
- **IP 기반 제한**: Fallback으로 사용
### Key Resolver
1. **userKeyResolver**: JWT에서 사용자 ID 추출 (기본)
2. **ipKeyResolver**: 클라이언트 IP 기반
3. **pathKeyResolver**: API 경로 기반
## Circuit Breaker
### 설정
- **실패율 임계값**: 50% (auth), 60% (bill, product), 70% (kos)
- **최소 호출 수**: 5-20회
- **Open 상태 대기시간**: 10-60초
- **Half-Open 상태 허용 호출**: 3-10회
### Fallback
Circuit Breaker가 Open 상태일 때 Fallback 응답을 제공:
- **인증 서비스**: 503 Service Unavailable
- **요금조회 서비스**: 캐시된 메뉴 데이터 제공 가능
- **상품변경 서비스**: 고객센터 안내 메시지
- **KOS 서비스**: 외부 시스템 점검 안내
## 모니터링
### Actuator 엔드포인트
```bash
# 애플리케이션 상태
GET /actuator/health
# Gateway 라우트 정보
GET /actuator/gateway/routes
# 메트릭 정보
GET /actuator/metrics
# 환경 정보 (개발환경만)
GET /actuator/env
```
### 로깅
- **개발환경**: DEBUG 레벨, 상세한 요청/응답 로그
- **운영환경**: INFO 레벨, 성능 고려한 최적화된 로그
## 보안
### HTTPS
운영 환경에서는 반드시 HTTPS를 사용해야 합니다.
### CORS
- **개발환경**: 모든 localhost 오리진 허용
- **운영환경**: 특정 도메인만 허용
### 보안 헤더
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY
- X-XSS-Protection: 1; mode=block
## 트러블슈팅
### 일반적인 문제
1. **Redis 연결 실패**
```bash
# Redis 서비스 상태 확인
systemctl status redis
# Redis 연결 테스트
redis-cli ping
```
2. **JWT 검증 실패**
```bash
# JWT 시크릿 키 확인
echo $JWT_SECRET
# 토큰 유효성 확인 (개발용)
curl -H "Authorization: Bearer <token>" http://localhost:8080/health
```
3. **Circuit Breaker Open**
```bash
# Circuit Breaker 상태 확인
curl http://localhost:8080/actuator/circuitbreakers
```
### 로그 확인
```bash
# 개발환경 로그
tail -f logs/api-gateway-dev.log
# 운영환경 로그
tail -f /var/log/api-gateway/api-gateway.log
```
## 성능 튜닝
### JVM 옵션 (운영환경)
```bash
java -server \
-Xms512m -Xmx1024m \
-XX:+UseG1GC \
-XX:G1HeapRegionSize=16m \
-XX:+UseStringDeduplication \
-jar api-gateway-1.0.0.jar
```
### Redis 최적화
- Connection Pool 설정 조정
- Pipeline 사용 고려
- 클러스터 모드 활용
## 개발 가이드
### 새로운 서비스 추가
1. `GatewayConfig`에 라우팅 규칙 추가
2. `SwaggerConfig`에 API 문서 URL 추가
3. `FallbackHandler`에 Fallback 로직 추가
4. Circuit Breaker 설정 추가
### 커스텀 필터 추가
```java
@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<Config> {
// 필터 구현
}
```
## 릴리스 노트
### v1.0.0 (2025-01-08)
- 초기 릴리스
- JWT 인증 시스템 구현
- 4개 마이크로서비스 라우팅 지원
- Circuit Breaker 및 Rate Limiting 구현
- Swagger 통합 문서화
- 헬스체크 및 모니터링 기능
## 라이선스
이 프로젝트는 회사 내부 프로젝트입니다.
## 기여
- **개발팀**: 이개발(백엔더)
- **검토**: 김기획(기획자), 박화면(프론트), 최운영(데옵스), 정테스트(QA매니저)