인증
나비잠 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/interactions | Discord Bot |
GET /v2/branches/*/calendar | V2 캘린더 조회 |
GET /v2/branches/*/reservations | V2 슬롯 조회 |
사용자 로그인 플로우
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계정: 전 지점 접근 가능- 일반 관리자: 할당된 지점만 접근 가능