• Home
  • About
  • Notes
  • Projects
<- Back to projects
projectsbackendnestjs9/28/2025

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 환경 대비)