1. 목적
사용자의 원활한 앱 사용을 위해 간편한 소셜 로그인 방식을 제공합니다.
가입과 로그인은 동일 화면 내에서 진행되며, 최초 가입 시 최소한의 정보만 수집해서 높은 전환율을 확보합니다.
2. 로그인 방식
| 방식 | 지원 여부 | 비고 |
|---|
| Google | 지원 | 전 국가 공통 기본 옵션 |
| Apple | 지원 | iOS에서만 노출 (GetPlatform.isIOS 체크) |
| 카카오톡 | 지원 | 한국에서 우선 노출 |
| LINE | 지원 | 일본/태국/대만에서 우선 노출 (LineRegion: ja, th, zh-TW) |
- 사용자의 국가 및 디바이스 설정 기준으로 적절한 소셜 로그인 버튼만 노출됩니다.
- 모든 소셜 로그인은 최초 1회 로그인 시 계정 연동을 위해 가능한 경우 이메일 및 이름(닉네임)을 수집합니다.
3. 지역별 소셜 로그인 버튼 순서
| 국가 / 지역 | 버튼 순서 |
|---|
한국 (ko) | 카카오 → Apple → Google → LINE |
일본/태국/대만 (ja, th, zh-TW) | LINE → Apple → Google → 카카오 |
| 그 외 지역 | Apple → Google → LINE → 카카오 |
- Apple 로그인 버튼은 iOS 기기에서만 표시되며, Android에서는 자동으로 목록에서 제외됩니다.
4. 14세 연령인증 (Age Gate)
- 신규 사용자가 소셜 로그인 버튼 클릭 시, 로그인 이전에 연령인증 화면으로 이동합니다.
- 사용자는 4자리 출생연도를 커스텀 숫자 키패드로 입력합니다.
현재연도 - 출생연도 >= 14 인 경우 인증 통과, 약관 동의 후 로그인이 진행됩니다.
- 14세 미만인 경우 인증 실패 처리되며, 에러 토스트(
info_unavailable)가 표시됩니다.
- 기존 사용자(마지막 로그인 기록이 있는 경우)는 연령인증을 건너뜁니다.
- 입력된 출생연도는
birth_year 필드로 서버에 저장됩니다.
5. 게스트 모드
- 로그인 화면 하단에 "둘러보기" 버튼이 제공됩니다.
- 게스트 모드로 진입하면 로그인 없이 지역 선택 화면(SelectMap)으로 이동합니다.
- 게스트 상태에서는 콘텐츠 탐색은 가능하지만, 구독/북마크/스티커 획득/녹음 등 계정 기반 기능은 사용할 수 없습니다.
- 기능 사용 시도 시 로그인 유도 팝업이 표시됩니다.
6. 로그인/회원가입 플로우
- 온보딩 이후 또는 '시작하기' 클릭 시 로그인 화면 진입
- 로그인 화면에서 아래 옵션 제공:
- 소셜 계정 버튼 클릭 → (신규 시) 연령인증 → 약관 동의 → 계정 연동 및 자동 가입 처리
- 게스트 모드 버튼 → 로그인 없이 탐색
- 최초 가입 시 약관 동의 절차 진행
- 필수 약관: 이용약관, 개인정보 수집 및 처리, 제3자 정보제공 및 14세이상 동의
- 선택 약관: 마케팅 수신 동의
7. 인증 및 보안
JWT 토큰 정책
| 항목 | 값 |
|---|
| Access Token 유효기간 | 1일 (JWT_ACCESS_TOKEN_LIFETIME=1) |
| Refresh Token 유효기간 | 7일 (JWT_REFRESH_TOKEN_LIFETIME=7) |
| 알고리즘 | HS256 |
Rate Limiting
| 엔드포인트 | 제한 |
|---|
로그인 (login) | 15회/분 |
회원가입 (register) | 9회/시간 |
일반 인증 사용자 (user) | 3000회/시간 |
비인증 사용자 (anon) | 300회/시간 |
소셜 로그인 보안
- 플랫폼 인증을 통해 계정 식별
- 중복 가입 방지를 위해 동일
social_provider + social_id 기반 유니크 제약 (unique_social_account)
- 동일 이메일 기반 계정 병합 처리
Placeholder Email
- 소셜 로그인 시 이메일을 제공하지 않는 경우,
{provider}_{social_id}@noemail.penta 형식의 placeholder 이메일이 자동 생성됩니다.
8. 다중 기기 로그인 및 세션 관리
- 1계정당 최대 2기기까지 동시 사용 가능 (
MAX_ACTIVE_DEVICES=2)
- 다른 기기에서 로그인 시, 기존 기기의
is_active가 False로 변경됩니다.
- 비활성화된 기기에서 API 요청 시
logged_in_elsewhere 에러가 반환되어 자동 로그아웃 처리됩니다.
- 기기 초과 시 기기 관리 팝업에서 기존 기기를 선택하여 로그아웃 후 진행할 수 있습니다.
9. 로그인 이력 추적
LoginHistory 모델을 통해 모든 로그인 이벤트가 기록됩니다.
- 기록 항목: 사용자 ID, 로그인 유형(google, apple, kakao, line, facebook), IP 주소, User-Agent, 연결 기기, 생성 일시
- 토큰 갱신(token_refresh)도 세션 활동으로 기록되며, 1시간 이내 중복 기록은 방지됩니다.
10. 로그인 화면 UI 정책
신규 사용자
- 환영 메시지 표시: "반가워요! / 신규 회원 누구나 / 3일 무제한" (
welcome_3days_free)
- 선물 상자 일러스트 노출
- 3일 무료 체험 혜택 강조
기존 사용자 (재방문)
- 펜타 로고 + 태그라인 표시
- 마지막 로그인 방식에 "최근 로그인" 툴팁 표시 (한국어/일본어에서만 활성화)
11. 기타 정책
- 로그인 유지: 사용자는 앱 삭제, 다른 디바이스 접속, 수동 로그아웃 전까지 자동 로그인 상태 유지
- 최근 로그인 방식 기억:
SharedPreferences에 last_login_method 저장
- 동일 소셜 계정으로 중복 가입 방지
- 탈퇴 후 7일간 재가입 불가 (
ACCOUNT_REJOIN_BLOCK_DAYS=7), DioException 403 응답 시 재가입 제한 안내 표시
- 30일간 데이터 보관 후 완전 삭제