Auth-Nest: 다중 세션 인증 시스템
https://github.com/kangko05/auth-nest
프로젝트 개요
NestJS와 TypeScript로 구현한 인증 시스템
핵심 기능
1. 다중 세션 관리
- 기기별 독립 세션: 각 디바이스(웹, 모바일 등)에서 독립적인 인증 상태 유지
- 세션 정보 추적: User-Agent, IP 주소, 로그인 시간 기록
- 선택적 로그아웃: 특정 세션만 로그아웃하거나 전체 세션 로그아웃 가능
2. JWT 기반 인증
- Access Token: 15분 만료, API 접근용
- Refresh Token: 7일 만료, 토큰 갱신용
- 토큰 로테이션: 갱신 시마다 새로운 토큰 쌍 발급
- 안전한 저장: Refresh token을 bcrypt로 해싱하여 Redis에 저장
3. 보안 강화 기능
- Rate Limiting: 1분에 5회 로그인 시도 제한
- 계정 잠금: 연속 5회 실패 시 30분간 계정 잠금
- 입력 검증: class-validator를 통한 포괄적인 데이터 검증
기술 스택
Backend Framework
- NestJS
데이터 저장
- PostgreSQL: 사용자 정보 영구 저장
- Redis: 세션 및 토큰 관리
- TypeORM: 데이터베이스 ORM
보안 & 검증
- bcrypt: 비밀번호 해싱
- JWT: 토큰 기반 인증
- class-validator: 입력 데이터 검증
- @nestjs/throttler: Rate limiting
아키텍처 설계
┌─────────────────────────────────┐
│ AuthController │ AuthService │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ UserRepository │ TokenRepository│
│ (Interface) │ (Interface) │
└─────────────────────────────────┘
┌─────────────────────────────────┐
│ TypeOrmUserRepo │ RedisTokenRepo│
└─────────────────────────────────┘
Redis 키 설계
refresh_token:userId:sessionId → 리프레시 토큰
user_sessions:userId → 활성 세션 ID 목록 (Set)
session_info:sessionId → 디바이스 정보 (JSON)
account_locked:email → 계정 잠금 상태
login_attempts:email → 로그인 실패 횟수
API 엔드포인트
기본 인증
POST /auth/register- 회원가입POST /auth/login- 로그인 (세션 생성)POST /auth/logout- 특정 세션 로그아웃POST /auth/logout2- 전체 세션 로그아웃
토큰 관리
POST /auth/refresh- 토큰 갱신
계정 관리
PATCH /auth/change-password- 비밀번호 변경
보안 고려사항
1. 토큰 보안
- Refresh token 해시 저장으로 데이터 유출 시 추가 보호
- 토큰 갱신 시 이전 토큰 무효화
- 세션 ID를 통한 토큰-세션 매핑
2. 계정 보호
- 실패 횟수 기반 자동 잠금
- Rate limiting으로 브루트포스 공격 방지
환경 설정 관리
ConfigService
jwt: {
accessSecret: process.env.JWT_ACCESS_SECRET || throwError("Required"),
refreshSecret: process.env.JWT_REFRESH_SECRET || throwError("Required"),
accessExpiresIn: process.env.JWT_ACCESS_EXPIRES_IN || "15m",
refreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || "7d",
}
테스트 및 검증
테스트 커버리지
- 단위 테스트: Jest를 활용한 각 메서드별 검증
- 통합 테스트: 실제 API 플로우 테스트
- 보안 테스트: 타이밍 공격, 계정 잠금 등 보안 기능 검증
- API 테스트: curl 스크립트를 통한 전체 플로우 검증
성능 측정
Apache Bench를 활용한 성능 벤치마크를 통해 시스템 특성 분석:
측정 결과:
- 로그인: 3,674 RPS, 평균 2.7ms
- 회원가입: 1,426 RPS, 평균 3.5ms
- 토큰 갱신: 56 RPS, 평균 178ms
병목 지점 발견:
- Refresh token bcrypt 해싱이 성능 저하의 주요 원인
- 보안과 성능 간의 트레이드오프 고려 필요
확장 가능성
MSA 대응
- 독립적인 인증 서비스로 분리 가능
- gRPC나 REST API로 다른 서비스와 연동
추가 기능 구현 가능
- 2FA (Two-Factor Authentication)
- OAuth 소셜 로그인
- 세션 분석 및 모니터링
실행 및 테스트
로컬 환경 설정
# 의존성 설치
npm install
# 환경변수 설정
cp .env.example .env
# 데이터베이스 설정
# PostgreSQL, Redis 실행 필요
# 개발 서버 실행
npm run start:dev
API 테스트
전체 인증 플로우를 curl 명령어로 검증 가능:
- 회원가입 → 로그인 → 토큰 갱신 → 비밀번호 변경 → 로그아웃
배운 점과 개선사항
기술적 성장
- Redis를 활용한 세션 관리 설계 경험
- 보안 요구사항을 고려한 시스템 설계
- 성능 측정을 통한 병목 지점 파악
향후 개선 방향
- 로깅 시스템 추가 (보안 이벤트 추적)
- 메트릭 수집 및 모니터링
- API 문서화 (Swagger)
- 헬스체크 시스템 (MSA 환경 대비)