본문으로 건너뛰기
버전: 개발 버전 (최신)

게스트 로그인 API

게스트 로그인 API는 이미 등록된 게스트 계정으로 다시 로그인하기 위한 인증 과정을 처리합니다. 성공적인 로그인 시, 새로운 액세스 토큰과 리프레시 토큰이 발급됩니다.

공통 요청 헤더

모든 dha-sleep API 요청은 공통 요청 헤더를 준수해야 합니다. User-Agent, Accept-Language, 인증 헤더 요구사항을 먼저 확인하세요.

참고

게스트 로그인을 위해서는 먼저 앱 인증을 통해 appToken을 획득해야 합니다.

게스트 로그인

디바이스 UUID를 사용하여 기존 게스트 계정에 로그인하고, 새로운 토큰을 발급받습니다.

  • HTTP Method: POST
  • Path: /v1/auth/guest/login (API_PREFIX 기본값이 v1이며 환경에 따라 변경 가능)
  • 인증: appToken 필요 (Authorization: Bearer {appToken})

Headers

HeaderTypeDescriptionRequired
Authorizationstring앱 인증 토큰 (Bearer {appToken})Yes
Content-Typeapplication/json요청 본문 형식을 지정합니다.Yes
User-AgentstringUser-Agent 헤더 (format: <product>/<version> (<platform>; <os>; <device>; <channel>; locale/<locale>))Yes

Request Body

{
"deviceUuid": "e8e53358-c282-4f69-89c4-bae40f0b7587"
}
필드타입설명필수
deviceUuidstring디바이스 UUID. 게스트 등록 시 사용한 것과 동일한 값Yes

Responses

응답 형식

게스트 로그인 API의 성공 응답 형식은 게스트 등록 API의 응답 형식과 동일합니다. 클라이언트에서 두 API의 응답을 동일한 데이터 모델로 처리할 수 있습니다 (로그인 응답에는 nextStepMessage 필드가 없음).

HTTP Status Code설명Error Code(s)
200 OK로그인 성공-
400 Bad Request잘못된 요청 (예: 유효하지 않은 디바이스 ID)2011
401 Unauthorized앱 토큰 인증 실패2051
404 Not Found게스트 계정을 찾을 수 없음2060
410 Gone게스트 계정이 만료됨 또는 업그레이드됨2061
500 Internal Server Error서버 내부 오류2000
200 OK - 로그인 성공

성공적으로 로그인하면 GuestLoginResponseDto에 정의된 게스트 세션 정보가 반환됩니다. 여기에는 인증 토큰, 게스트 계정 정보, 프로필 정보, 역할, 권한 및 동의한 약관 목록이 포함됩니다.

{
"tokens": [
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"type": "ACCESS_TOKEN",
"expiresIn": 900,
"issuedAt": 1714523700000
},
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"type": "REFRESH_TOKEN",
"expiresIn": 43200,
"issuedAt": 1714523700000
}
],
"user": {
"id": "guest_a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6",
"identityLevel": "GUEST",
"createdAt": 1714520000000,
"expiresAt": 1714606400000
},
"userCycle": {
"id": "d2f8e5c1-9b3a-4f8c-8e2f-1b9a3c5e2d7c",
"status": "ACTIVE",
"startedAt": 1714520000000,
"count": 1,
"treatmentDurationDays": -1
},
"profile": {
"language": "ko-KR",
"timezone": {
"id": "Asia/Seoul",
"offsetInMinutes": 540
}
},
"roles": ["guest.user"],
"permissions": ["sleep.log.create", "sleep.log.read", "content.read"],
"agreements": [
{
"versionId": "9f8a7b6c-5d4e-3f2g-1h0i-j9k8l7m6n5o4",
"type": "TERMS",
"isRequired": true,
"text": "서비스 이용약관",
"detailsUrl": "https://www.example.com/terms",
"isAgreed": true,
"agreedAt": 1714520000000
}
]
}
필드타입설명예시필수
tokensarray인증 토큰 정보 배열. 정확히 2개의 토큰(access token과 refresh token)을 포함합니다.Yes
tokens[].tokenstringJWT 토큰 값eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Yes
tokens[].typestring토큰 타입ACCESS_TOKEN 또는 REFRESH_TOKENYes
tokens[].expiresInnumber토큰 만료 시간 (초)900Yes
tokens[].issuedAtnumber토큰 발급 시간 (Unix timestamp in milliseconds, Kotlin: Long, Swift: Int64)1714523700000Yes
userobject사용자(게스트) 계정 정보Yes
user.idstring사용자 계정 IDguest_a1b2c3d4-...Yes
user.identityLevelstring신원 수준 (게스트의 경우 GUEST)GUESTYes
user.createdAtnumber계정 생성일 (Unix timestamp in milliseconds, Kotlin: Long, Swift: Int64)1714520000000Yes
user.expiresAtnumber세션 만료일 (Unix timestamp in milliseconds, Kotlin: Long, Swift: Int64)1714606400000No
userCycleobject사용자 주기 정보 (정식 사용자 login API의 userCycle과 동일한 형식)Yes
userCycle.idstring사용자 주기 IDd2f8e5c1-9b3a-4f8c-8e2f-1b9a3c5e2d7cYes
userCycle.statusstring사용자 주기 상태ACTIVEYes
userCycle.startedAtnumber주기 시작일 (Unix timestamp in milliseconds, Kotlin: Long, Swift: Int64)1714520000000Yes
userCycle.countnumber해당 사용자의 총 주기 개수 (게스트는 항상 1)1Yes
userCycle.treatmentDurationDaysnumber치료 주기의 총 기간 (일수, Kotlin: Int, Swift: Int). 게스트는 -1 (무제한)-1Yes
profileobject사용자 프로필 정보Yes
profile.languagestring사용자 언어 설정 (예: ko-KR, de-DE)ko-KRYes
profile.timezoneobject사용자 시간대 정보Yes
profile.timezone.idstring시간대 ID (예: Asia/Seoul)Asia/SeoulYes
profile.timezone.offsetInMinutesnumberUTC 기준 오프셋 (분 단위, Kotlin: Int, Swift: Int)540Yes
rolesstring[]게스트 역할 목록["guest.user"]Yes
permissionsstring[]게스트 권한 목록["sleep.log.create", "sleep.log.read"]Yes
agreementsobject[]동의한 약관 목록Yes
agreements[].versionIdstring약관 버전 IDYes
agreements[].typestring약관 타입 (TERMS, CONSENT, PRIVACY_POLICY)TERMSYes
agreements[].isRequiredboolean필수 약관 여부Yes
agreements[].textstring약관 요약 텍스트Yes
agreements[].detailsUrlstring약관 상세 URLYes
agreements[].isAgreedboolean동의 여부Yes
agreements[].agreedAtnumber동의 시각 (Unix timestamp in milliseconds, Kotlin: Long, Swift: Int64)Yes
400 Bad Request - 잘못된 요청

예시: 디바이스 ID 오류

{
"code": 2011,
"message": "INVALID_DEVICE_ID",
"detail": "디바이스 ID가 유효하지 않거나 필수 필드가 누락되었습니다",
"errors": [
{
"field": "device.uuid",
"message": "device.uuid는 필수입니다."
}
]
}
401 Unauthorized - 인증 실패
{
"code": 2051,
"message": "INVALID_TOKEN",
"detail": "토큰이 유효하지 않습니다"
}
404 Not Found - 게스트 계정을 찾을 수 없음
{
"code": 2060,
"message": "GUEST_ACCOUNT_NOT_FOUND",
"detail": "해당 디바이스로 등록된 게스트 계정을 찾을 수 없습니다"
}

이 오류는 해당 디바이스 UUID로 등록된 게스트 계정이 존재하지 않을 때 발생합니다. 게스트 등록을 먼저 진행해야 합니다.

410 Gone - 게스트 계정 만료 또는 업그레이드됨

예시: 게스트 계정 만료

{
"code": 2061,
"message": "GUEST_ACCOUNT_EXPIRED",
"detail": "게스트 계정이 만료되었습니다. 정식 가입을 진행해주세요.",
"metadata": {
"expiredAt": 1714606400000
}
}

예시: 정식 사용자로 업그레이드됨

{
"code": 2062,
"message": "GUEST_ACCOUNT_UPGRADED",
"detail": "게스트 계정이 정식 사용자로 업그레이드되었습니다. 정식 로그인을 사용해주세요."
}

이 오류는 게스트 계정이 만료되었거나 Step-up 인증을 통해 정식 사용자로 업그레이드된 경우 발생합니다.

500 Internal Server Error - 서버 내부 오류
{
"code": 2000,
"message": "SERVER_ERROR",
"detail": "서버 내부 오류"
}

설명

전체 프로세스 가이드

게스트 등록 및 로그인 프로세스의 전체 흐름은 게스트 등록 프로세스 가이드를 참고하세요.

게스트 로그인 vs 게스트 등록

항목게스트 등록게스트 로그인
용도새 게스트 계정 생성기존 게스트 계정으로 재로그인
필수 입력deviceUuid, agreements, profiledeviceUuid만 필요
응답{ success: true }tokens + user + userCycle 등
사용 시점앱 최초 실행 또는 재설치 후앱 재시작 또는 토큰 만료 후

토큰 갱신

게스트 로그인 성공 시 발급받은 토큰의 유효 기간:

  • Access Token: 15분 (expiresIn: 900)
  • Refresh Token: 12시간 (expiresIn: 43200)

토큰 만료 전에 토큰 갱신 API를 사용하여 새로운 토큰을 발급받을 수 있습니다.

게스트 계정 제한사항

게스트 계정은 제한된 신원 수준(Identity Level: GUEST)으로 다음과 같은 제한이 있습니다:

  • 일부 기능만 접근 가능 (permissions 참조)
  • 정식 사용자 전용 기능(보고서 다운로드, 데이터 동기화 등) 사용 불가
  • Step-up 인증을 통해 정식 사용자로 업그레이드 가능

오류 코드 참조

코드메시지설명
2000SERVER_ERROR서버 내부 오류
2011INVALID_DEVICE_ID디바이스 ID가 유효하지 않음
2051INVALID_TOKEN앱 토큰이 유효하지 않음
2060GUEST_ACCOUNT_NOT_FOUND해당 디바이스의 게스트 계정이 존재하지 않음
2061GUEST_ACCOUNT_EXPIRED게스트 계정이 만료됨
2062GUEST_ACCOUNT_UPGRADED게스트 계정이 정식 사용자로 업그레이드됨