회원가입·로그인·토큰 관리를 담당하는 독서 게이미피케이션 플랫폼 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 # 만료 토큰 정리 (스케줄러용)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 게이트웨이 주소.
- @frolog/models 참고.
JWT_PUBLIC_KEY: JWT 액세스 토큰 공개 키.SSC_TOKEN: 사전에 발급받은 서비스 간 통신 액세스 토큰.EMAIL_SECRET: 이메일 암호화 키.EMAIL_SALT: 이메일 해시 솔트.BCRYPT_ROUNDS: bcrypt 라운드 수.HASHIDS_SALT: Hashids 솔트.EMAIL_CODE_KEY: 이메일 인증 JWT 토큰 대칭 키.PII_SECRET: PII 암호화 대칭 키.