카카오 API에서 제공하는 리프레시 토큰(refresh_token)은 사용자가 기존 액세스 토큰(access_token)이 만료되었을 때, 새로운 액세스 토큰을 발급받을 수 있도록 도와주는 중요한 역할을 합니다.
이를 통해 사용자는 별도의 로그인 절차 없이 계속해서 카카오 API를 활용할 수 있습니다.
엔드포인트
@router.get("/kakao/refresh"): 사용자의 리프레시 토큰을 사용하여 새로운 액세스 토큰을 발급받는 API입니다.
DB에서 리프레시 토큰 조회
사용자 ID를 통해 데이터베이스에서 해당 사용자의 리프레시 토큰 정보를 가져옵니다.
토큰이 없거나 유효하지 않으면 404 에러를 반환합니다.
카카오 API 요청
카카오 API URL(https://kauth.kakao.com/oauth/token)에 POST 요청을 보내 새로운 액세스 토큰을 발급받습니다.
토큰 갱신 및 DB 업데이트
응답으로 받은 새로운 액세스 토큰과 만료 정보를 계산하여 DB에 저장합니다.
갱신된 토큰 반환
갱신된 액세스 토큰을 사용자에게 반환합니다.
@router.get("/kakao/refresh")
async def kakao_refresh_token(user_id: int = Depends(get_current_user_id), db: Session = Depends(get_db)):
# 1. DB에서 사용자 리프레시 토큰 조회
token_entry = db.query(Token).filter(Token.user_id == user_id).first()
if not token_entry or not token_entry.refresh_token:
raise HTTPException(status_code=404, detail="Token not found for the user")
refresh_token = token_entry.refresh_token
try:
# 2. 카카오 리프레시 토큰으로 새 액세스 토큰 요청
kakao_token_url = "https://kauth.kakao.com/oauth/token"
data = {
"grant_type": "refresh_token",
"client_id": KAKAO_CLIENT_ID,
"refresh_token": refresh_token,
}
async with httpx.AsyncClient() as client:
token_response = await client.post(kakao_token_url, data=data)
if token_response.status_code != 200:
raise HTTPException(status_code=401, detail="Kakao refresh token request failed")
# 3. 새로운 액세스 토큰 처리
token_json = token_response.json()
new_access_token = token_json.get("access_token")
expires_in = token_json.get("expires_in")
# 4. DB 업데이트
token_entry.token = new_access_token
token_entry.expires_at = datetime.now() + timedelta(seconds=expires_in)
db.commit()
return {
"status": 200,
"message": "토큰 갱신 성공",
"data": {
"access_token": new_access_token
}
}
except httpx.RequestError as e:
raise HTTPException(status_code=500, detail=f"Kakao API request error: {str(e)}")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
자동 토큰 갱신: 사용자의 액세스 토큰이 만료될 경우, 별도의 로그인 없이 자동으로 갱신합니다.
유지 관리: 리프레시 토큰을 활용하여 사용자 경험을 끊김 없이 제공합니다.
이렇게 하면 카카오 API를 활용한 토큰 갱신 시스템을 완성할 수 있습니다.
FastAPI와 카카오 API를 활용하는 개발자들에게 도움이 되길 바랍니다!