Soonlife 개발 문서
Soonlife 앱 — 구글 OAuth 인증 백엔드 API 명세 및 개발 가이드
프로젝트 소개
Soonlife는 Expo(React Native) 앱이며, 이 문서는 그중 구글 OAuth 로그인 백엔드 API를 다룹니다.
Expo 앱이 구글 로그인으로 획득한 ID 토큰을 백엔드로 전달하면, 백엔드가 구글 서버에 토큰을 검증하고 자체 JWT(access/refresh) 를 발급하는 방식입니다. 회원가입은 별도 절차 없이 최초 로그인 시 자동으로 처리됩니다.
Expo 앱 자체(프론트엔드)는 이 백엔드 저장소에서 다루지 않습니다. 이 문서는 app_api 백엔드 프로젝트 기준입니다.
기술 스택
| 레이어 | 기술 |
|---|---|
| 백엔드 | Django 6.0, Django REST Framework, djangorestframework-simplejwt, google-auth, django-cors-headers, MariaDB (PyMySQL) |
| 프론트엔드 | Expo (React Native), expo-router |
인증 흐름
1. Expo 앱: 구글 로그인 → id_token 획득
2. Expo 앱 → 백엔드: POST /api/auth/google/ { id_token }
3. 백엔드: 구글 서버에 id_token 검증 → 사용자 조회/생성 → JWT(access, refresh) 발급
4. Expo 앱: 이후 모든 요청에 Authorization: Bearer <access> 헤더 포함
5. access 만료 시: POST /api/auth/token/refresh/ 로 재발급
6. 로그아웃 시: POST /api/auth/logout/ { refresh }계정 식별은 이메일이 아니라 구글 ID 토큰의 sub 클레임(구글 계정 고유 식별자)을 기준으로 합니다.
빠른 시작
구현된 기능
| 카테고리 | 기능 |
|---|---|
| 인증 | 구글 ID 토큰 검증 / 로그인·회원가입 자동 처리 / JWT 발급·재발급 / 로그아웃(블랙리스트) |
보안 설계
| 항목 | 구현 방식 |
|---|---|
| 사용자 식별 | 이메일이 아닌 구글 sub(고유 ID) 기준 |
| 이메일 검증 | 구글 ID 토큰의 email_verified 클레임 확인, 미인증 시 로그인 거부 |
| 토큰 발급 대상 검증 | aud 클레임이 GOOGLE_OAUTH_CLIENT_IDS 허용 목록에 있는지 확인 |
| 발급자 검증 | iss 클레임이 구글(accounts.google.com)인지 확인 |
| 비밀번호 | 저장하지 않음 (set_unusable_password()) — 구글 로그인 전용 |
| 토큰 방식 | JWT (access 30분 / refresh 14일, rotate + blacklist) |
| Django admin | 비활성화 (django.contrib.admin 미설치) |
구글 서버에서 가져오는 정보
별도 API 호출 없이, 검증된 ID 토큰(JWT)의 클레임을 그대로 사용합니다.
| 클레임 | 용도 |
|---|---|
sub | 구글 계정 고유 식별자 → 사용자 조회/생성 키 |
email | 이메일 |
email_verified | 이메일 인증 여부 검증용 (저장하지 않음) |
name | 이름 |
aud / iss | 토큰 발급 대상/발급자 검증용 (저장하지 않음) |