본문 바로가기
카테고리 없음

내 코드로 Kakao와 Naver를 활용 할 수 있다면?

by 개발자를 꿈꾸는 사람들과 함꼐 2025. 7. 1.

 

1. Kakao & Naver OAuth2 개요 및 준비 사항

Kakao와 Naver는 자체 OAuth2 인증 서버를 제공하여 사용자가 계정 정보를 이용해 로그인할 수 있도록 지원합니다.
이를 FastAPI와 연동하면, 별도의 회원가입 없이도 안전하게 사용자 인증을 처리할 수 있습니다.

1. Kakao Developer 설정

      
  1. https://developers.kakao.com 접속
  2.   
  3. 내 애플리케이션 → 앱 생성
  4.   
  5. 플랫폼 → Redirect URI 추가: http://localhost:8000/auth/kakao/callback
  6.   
  7. REST API 키 확인

2. Naver Developer 설정

      
  1. https://developers.naver.com → 애플리케이션 등록
  2.   
  3. Callback URL: http://localhost:8000/auth/naver/callback
  4.   
  5. 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 발급 등 인증 시스템 통합 필요