인증 패턴
개요
DTA-WIDE 시스템은 마이크로서비스 아키텍처를 기반으로 하며, 다양한 인증 패턴을 통해 보안성과 확장성을 보장합니다. 이 문서는 시스템에서 사용되는 주요 인증 패턴들과 각각의 적용 사례를 설명합니다.
인증 패턴 분류
1. Service-to-Service Authentication (서비스 간 인증)
정의: 마이크로서비스 간의 내부 통신에서 사용되는 인증 방식입니다.
특징:
- API Key + JWT Token 조합 사용
- Google Service Account 방식과 유사
- 장기 자격 증명(API Key) + 단기 액세스 토큰(JWT)
적용 사례:
구현 방법:
- 각 서비스는 고유한 API Key 보유
- JWT 토큰을 통한 단기 인증
- 토큰 자동 갱신 메커니즘
현재 구현 프로젝트:
- dta-wide-api: 서비스 간 내부 API 호출에 사용
- dta-wide-agent-qa: QA 에이전트의 시스템 리소스 접근
- dta-wide-mcp: 시스템 레벨 MCP 툴 (로그 조회, 메트릭 수집)
2. User Token Delegation Pattern (사용자 토큰 위임)
정의: 중간 서비스가 사용자를 대신하여 토큰을 관리하고 API 호출을 수행하는 패턴입니다.
특징:
- 클라이언트 복잡성 감소
- 중앙화된 토큰 관리
- 자동 토큰 갱신
적용 사례:
현재 구현 프로젝트:
- dta-wide-mcp: MCP Server에서 Chat Service의 사용자 토큰을 위임받아 dta-wide-api 호출
TokenManagerService: 사용자별 토큰 저장 및 자동 갱신ApiClientService: 토큰 기반 HTTP 클라이언트McpToolsService: 사용자 개인 데이터 접근 툴 제공
장점:
- 클라이언트는 토큰 만료 처리 불필요
- 중앙화된 토큰 관리로 보안성 향상
- 자동 재시도 및 오류 처리
단점:
- 중간 서비스의 복잡성 증가
- 토큰 저장 및 보안 고려사항
- 추가적인 네트워크 홉
3. API Gateway Authentication (API 게이트웨이 인증)
정의: API Gateway에서 모든 인증을 처리하고 백엔드 서비스로 전달하는 패턴입니다.
특징:
- 중앙화된 인증 처리
- 백엔드 서비스는 인증 로직 불필요
- 횡단 관심사 분리
적용 사례:
현재 구현 프로젝트:
- 계획 중: 향후 외부 API 노출시 API Gateway 패턴 적용 예정
- dta-wide-api: 일부 엔드포인트에서 중앙화된 인증 미들웨어 사용
4. Direct User Authentication (직접 사용자 인증)
정의: 클라이언트가 직접 인증 서버와 통신하여 토큰을 관리하는 전통적인 방식입니다.
특징:
- 클라이언트가 모든 토큰 관리 책임
- 직접적인 통신으로 지연 시간 최소화
- 클라이언트 복잡성 증가
적용 사례:
현재 구현 프로젝트:
- dta-wide-api: 모바일 앱 및 웹 클라이언트의 직접 인증
/auth/login,/auth/refresh엔드포인트 제공- JWT 기반 액세스 토큰 및 리프레시 토큰 발급
패턴별 비교
| 패턴 | 복잡성 | 보안성 | 성능 | 확장성 | 적용 사례 |
|---|---|---|---|---|---|
| Service-to-Service | 중간 | 높음 | 높음 | 높음 | 내부 서비스 통신 |
| User Token Delegation | 높음 | 높음 | 중간 | 높음 | MCP Server, BFF |
| API Gateway | 중간 | 높음 | 중간 | 높음 | 외부 API 노출 |
| Direct User Auth | 낮음 | 중간 | 높음 | 중간 | 단순한 클라이언트 |
토큰 생명주기 관리
토큰 저장 전략
메모리 기반 저장:
- 빠른 액세스
- 서버 재시작시 손실
- 확장성 제한
Redis 기반 저장:
- 영속성 보장
- 분산 환경 지원
- 네트워크 오버헤드
데이터베이스 저장:
- 완전한 영속성
- 감사 로그 지원
- 성능 오버헤드
토큰 갱신 전략
사전 갱신 (Proactive Refresh):
// 만료 5분 전 자동 갱신
if (token.expiresAt - Date.now() < 5 * 60 * 1000) {
await refreshToken(token);
}
반응적 갱신 (Reactive Refresh):
// 401 에러 발생시 갱신 후 재시도
try {
return await apiCall(token);
} catch (error) {
if (error.status === 401) {
const newToken = await refreshToken(token);
return await apiCall(newToken);
}
throw error;
}
보안 고려사항
토큰 암호화
- 저장시 토큰 암호화 필수
- AES-256-GCM 권장
- 키 순환 정책 적용
감사 로깅
- 모든 토큰 작업 로깅
- 사용자별 토큰 사용 추적
- 비정상적인 패턴 감지
토큰 순환
- 정기적인 토큰 갱신
- 의심스러운 활동시 즉시 무효화
- 세션 종료시 토큰 정리
구현 가이드라인
1. 패턴 선택 기준
User Token Delegation을 선택하는 경우:
- 클라이언트가 단순해야 하는 경우
- 중앙화된 토큰 관리가 필요한 경우
- 여러 백엔드 서비스 호출이 필요한 경우
Direct Authentication을 선택하는 경우:
- 단순한 클라이언트-서버 구조
- 최소한의 지연 시간이 중요한 경우
- 클라이언트가 토큰 관리 능력을 갖춘 경우
2. 오류 처리 전략
class AuthenticationError extends Error {
constructor(
message: string,
public readonly code: string,
public readonly retryable: boolean = false
) {
super(message);
}
}
// 재시도 가능한 오류
throw new AuthenticationError('Token expired', 'TOKEN_EXPIRED', true);
// 재시도 불가능한 오류
throw new AuthenticationError('Invalid credentials', 'INVALID_CREDENTIALS', false);
3. 모니터링 및 알림
핵심 메트릭:
- 토큰 갱신 성공률
- 인증 실패율
- 평균 토큰 생명주기
- API 호출 지연 시간
알림 조건:
- 토큰 갱신 실패율 > 5%
- 인증 실패율 > 10%
- 비정상적인 토큰 사용 패턴 감지
관련 문서
- 통합 패턴 - 서비스 간 통합 방법
- 토큰 관리 아키텍처 - 토큰 관리 구현 세부사항
- 보안 가이드라인 - 토큰 위임 보안 고려사항