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- 비밀번호 변경