본문으로 건너뛰기

인증

나비잠 API는 Redis 기반 세션 인증을 사용합니다. Interceptor가 요청을 가로채어 인증 여부를 확인합니다.

세션 저장소

  • 저장소: Redis (Spring Session)
  • 키 접두사: nabijam:session
  • 쿠키: JSESSIONID (HTTP-Only, Secure)

인증 계층

1단계: LoginCheckInterceptor

모든 요청에 적용되며, 세션이 없으면 401 Unauthorized를 반환합니다.

{
"status": "error",
"errorType": "AuthenticationError",
"message": "인증되지 않은 사용자입니다."
}

2단계: AdminCheckInterceptor

/admin/** 경로에 추가 적용되며, 세션의 loginType"admin"이 아니면 403 Forbidden을 반환합니다.

{
"status": "error",
"errorType": "AuthorizationError",
"message": "인가되지 않은 사용자입니다."
}

인증 제외 경로

다음 경로는 세션 없이 접근 가능합니다.

경로설명
POST /account/code인증코드 요청
POST /account/login로그인
POST /reservation예약 생성
POST /payment, /payment/confirm결제
POST /virtualaccount/webhook가상계좌 입금 웹훅
POST /admin/login관리자 로그인
POST /franchise/**가맹모집
/door/v2/unlock/*도어락 제어
/discord/interactionsDiscord Bot
GET /v2/branches/*/calendarV2 캘린더 조회
GET /v2/branches/*/reservationsV2 슬롯 조회

사용자 로그인 플로우

1. 인증코드 요청

POST /account/code로 휴대폰 또는 이메일 인증코드를 요청합니다.

  • 6자리 인증코드 생성 → Redis에 저장 (TTL 3분)
  • 휴대폰: 카카오 알림톡으로 발송
  • 이메일: 메일로 발송
  • 예약 이력이 없는 사용자는 요청 불가

2. 로그인

POST /account/login으로 인증코드를 검증하고 세션을 생성합니다.

세션 속성:

loginType: "mobile" | "email"
loginId: "01012345678" | "user@email.com"

관리자 로그인

POST /admin/login으로 ID/PW 로그인합니다 (BCrypt 비밀번호 검증).

세션 속성:

loginType: "admin"
adminLoginId: "hq"
branchList: ["Gwanghwamun", "Yeouido", ...]
  • 세션 만료: 24시간
  • hq 계정: 전 지점 접근 가능
  • 일반 관리자: 할당된 지점만 접근 가능