Skip to content

Team-Frolog/auth-service

Repository files navigation

auth-service

회원가입·로그인·토큰 관리를 담당하는 독서 게이미피케이션 플랫폼 Frolog의 인증 도메인 서비스입니다.

이메일/구글 OAuth 로그인, JWT 토큰 발급·갱신·폐기, 이메일 인증, 비밀번호 재설정, 계정 탈퇴를 처리합니다.

주요 기능

  • 회원가입 (이메일 인증, 동의 수집, 개인정보 암호화 저장)
  • 로그인 (이메일/비밀번호, Google OAuth 2.0)
  • JWT 토큰 발급·갱신 (Access Token 1시간, Refresh Token 30일)
  • 리프레시 토큰 체인 관리 및 재사용 탐지 (Replay Attack 방지)
  • 이메일 인증 코드 발송 (AWS SES) 및 검증 (PBKDF2)
  • 비밀번호 재설정
  • 이메일 중복 체크
  • 로그아웃 (토큰 체인 전체 무효화)
  • 계정 탈퇴 (탈퇴 사유 수집)
  • 만료 토큰 주간 자동 정리 스케줄러

기술 스택

  • Node.js (ESM), Express 기반 @frolog/express-api-server
  • ORM: Sequelize (@frolog/models, RefreshToken은 MEMORY 엔진 사용)
  • 공통 유틸: @frolog/common-utils (로거, 해싱, SSC 토큰 등)
  • API 계약: @frolog/frolog-api
  • JWT: jsonwebtoken (RS256), 비밀번호: bcrypt
  • OAuth: google-auth-library, googleapis (Sheets API)
  • Email: AWS SES (aws-sdk)
  • Lint/Format: ESLint, Prettier

실행 방법

npm install
npm run dev   # 개발 (nodemon)
npm start     # 프로덕션
npm run lint  # 코드 규칙 검사
npm run doc   # JSDoc 생성

디렉터리 구조

src/
  index.js                  # API 서버 부트스트랩, 라우팅, 스케줄러
  common/
    constants.js            # 환경변수 및 비밀키 (JWT, 이 메일, Google 등)
    utils.js                # 유틸리티 함수
  services/
    signUp.js               # 회원가입 (user-service, profile-service, well-service, wallet-service 연계)
    signIn.js               # 이메일/비밀번호 로그인
    signInGoogle.js         # Google OAuth 로그인
    signOut.js              # 로그아웃 (토큰 체인 무효화)
    refreshToken.js         # 토큰 갱신 (재사용 탐지)
    createToken.js          # JWT Access/Refresh 토큰 생성
    requestEmailCode.js     # 이메일 인증 코드 발송 (AWS SES)
    verifyEmailCode.js      # 이메일 코드 검증 (PBKDF2)
    getEmailAvailability.js # 이메일 중복 체크
    resetPassword.js        # 비밀번호 재설정
    postInitialSurvey.js    # 초기 설문조사 (Google Sheets 저장)
    quit.js                 # 계정 탈퇴 (탈퇴 사유 수집)
    googleSheet.js          # Google Sheets API 연동
    cleanOldTokens.js       # 만료 토큰 정리 (스케줄러용)

API 엔드포인트 맵

src/index.js에서 @frolog/frolog-api 스펙과 서비스 로직을 매핑합니다.

  • POST
    • RequestEmailCode
    • VerifyEmailCode
    • SignUp
    • SignIn
    • SignInGoogle
    • RefreshToken
    • SignOut (login)
    • ResetPassword
    • PostInitialSurvey (login)
    • Quit (login)
  • GET
    • GetEmailAvailability

스케줄러

  • 매주 월요일 KST 04:00 (UTC 19:00) cleanOldTokens 자동 실행
  • 만료된 리프레시 토큰 체인을 무효화하여 DB 정리
  • 마스터 프로세스(IS_MASTER)에서만 동작

권한/인증

  • JWT Access Token: RS256 알고리즘, 1시간 만료, {id, is_admin, session} 포함
  • Refresh Token: UUID 기반, DB 저장 (MEMORY 엔진), 30일 만료, 체인 구조로 재사용 탐지
  • Email Code Token: 대칭키 JWT, 3분 만료 (코드 발송), 1일 만료 (검증 완료 후)
  • Token Chaining: parent_token으로 토큰 체인 추적, 재사용 감지 시 전체 체인 무효화
  • Replay Attack 방지: 5초 이내 재사용은 허용 (race condition), 이후 재사용 시 체인 무효화
  • 비밀번호: bcrypt 해싱 (configurable rounds, 기본 10)
  • 이메일: SHA256 해싱 (salt 사용, 조회 성능), 암호화 저장
  • 개인정보: PII_SECRET으로 애플리케이션 레벨 암호화
  • 이메일 인증: PBKDF2 100,000 iterations, SHA256, 64-byte 해시
  • Google OAuth: Authorization code flow, 구글 계정과 로컬 계정 구분 (login_type: 0=local, 1=google)

환경 변수

아래 모든 환경변수는 선택적 필드입니다.

서비스

  • NODE_ENV: Node 동작 환경.
  • SERVICE_NAME: 서비스 ID.
  • NODE_PORT 또는 PORT: HTTP 서버 포트.
  • API_GATEWAY: API 게이트웨이 주소.

인프라

비밀 키

  • JWT_PUBLIC_KEY: JWT 액세스 토큰 공개 키.
  • SSC_TOKEN: 사전에 발급받은 서비스 간 통신 액세스 토큰.
  • EMAIL_SECRET: 이메일 암호화 키.
  • EMAIL_SALT: 이메일 해시 솔트.
  • BCRYPT_ROUNDS: bcrypt 라운드 수.
  • HASHIDS_SALT: Hashids 솔트.
  • EMAIL_CODE_KEY: 이메일 인증 JWT 토큰 대칭 키.
  • PII_SECRET: PII 암호화 대칭 키.

About

사용자 인증 서비스.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors 3

  •  
  •  
  •