1. Kakao & Naver OAuth2 개요 및 준비 사항
Kakao와 Naver는 자체 OAuth2 인증 서버를 제공하여 사용자가 계정 정보를 이용해 로그인할 수 있도록 지원합니다.
이를 FastAPI와 연동하면, 별도의 회원가입 없이도 안전하게 사용자 인증을 처리할 수 있습니다.
1. Kakao Developer 설정
- https://developers.kakao.com 접속
- 내 애플리케이션 → 앱 생성
- 플랫폼 → Redirect URI 추가:
http://localhost:8000/auth/kakao/callback
- REST API 키 확인
2. Naver Developer 설정
- https://developers.naver.com → 애플리케이션 등록
- Callback URL:
http://localhost:8000/auth/naver/callback
- Client ID / Client Secret 확인
이 정보들은 환경변수(.env)에 저장해 사용합니다.
# .env 예시
KAKAO_CLIENT_ID=xxx
NAVER_CLIENT_ID=xxx
NAVER_CLIENT_SECRET=xxx
2. FastAPI로 Kakao & Naver OAuth2 연동하기
authlib
라이브러리를 사용하면 OAuth 클라이언트를 쉽게 구현할 수 있습니다.
1. 의존성 설치
pip install fastapi[all] authlib python-dotenv
2. 전체 코드 예제 (main.py)
import os
from fastapi import FastAPI, Request
from fastapi.responses import RedirectResponse
from authlib.integrations.starlette_client import OAuth
from dotenv import load_dotenv
from starlette.config import Config
load_dotenv()
app = FastAPI()
config = Config(environ=os.environ)
oauth = OAuth(config)
# Kakao OAuth 등록
oauth.register(
name='kakao',
client_id=os.environ["KAKAO_CLIENT_ID"],
access_token_url='https://kauth.kakao.com/oauth/token',
authorize_url='https://kauth.kakao.com/oauth/authorize',
api_base_url='https://kapi.kakao.com',
client_kwargs={'scope': 'profile account_email'},
)
# Naver OAuth 등록
oauth.register(
name='naver',
client_id=os.environ["NAVER_CLIENT_ID"],
client_secret=os.environ["NAVER_CLIENT_SECRET"],
access_token_url='https://nid.naver.com/oauth2.0/token',
authorize_url='https://nid.naver.com/oauth2.0/authorize',
api_base_url='https://openapi.naver.com/v1/nid',
client_kwargs={'scope': 'profile'},
)
@app.get("/")
def root():
return {
"login_kakao": "/auth/kakao/login",
"login_naver": "/auth/naver/login"
}
@app.get("/auth/kakao/login")
async def login_kakao(request: Request):
redirect_uri = request.url_for('kakao_callback')
return await oauth.kakao.authorize_redirect(request, redirect_uri)
@app.get("/auth/kakao/callback")
async def kakao_callback(request: Request):
token = await oauth.kakao.authorize_access_token(request)
resp = await oauth.kakao.get('v2/user/me', token=token)
user_info = resp.json()
return {"kakao_user": user_info}
@app.get("/auth/naver/login")
async def login_naver(request: Request):
redirect_uri = request.url_for('naver_callback')
return await oauth.naver.authorize_redirect(request, redirect_uri)
@app.get("/auth/naver/callback")
async def naver_callback(request: Request):
token = await oauth.naver.authorize_access_token(request)
resp = await oauth.naver.get('me', token=token)
user_info = resp.json()
return {"naver_user": user_info}
3. 실행
uvicorn main:app --reload
http://localhost:8000/auth/kakao/login
접속 → 카카오 로그인http://localhost:8000/auth/naver/login
접속 → 네이버 로그인
3. 사용자 정보 파싱 및 실무 적용 팁
1. Kakao 사용자 정보 구조
{
"id": 123456789,
"kakao_account": {
"email": "user@kakao.com",
"profile": {
"nickname": "홍길동"
}
}
}
2. Naver 사용자 정보 구조
{
"response": {
"id": "D7gA1sdf...",
"email": "user@naver.com",
"name": "홍길동"
}
}
각 플랫폼의 JSON 구조가 다르므로 사용자 정보 추출 시 예외 처리와 키 확인이 중요합니다.
3. 유저 정보 파싱 예제
email = user_info["kakao_account"]["email"]
nickname = user_info["kakao_account"]["profile"]["nickname"]
4. 사용자 DB와 연동
user = db.get_user_by_email(email)
if not user:
user = db.create_user(email=email, nickname=nickname)
5. 실무 적용 시 고려사항
- ⚠ 리디렉션 URI는 HTTPS + 정확한 경로 등록 필수
- 🔐 Client Secret은 .env 또는 GitHub Secret으로 관리
- 🔁 소셜 계정 연동 후 JWT 발급 등 인증 시스템 통합 필요