본문 바로가기
BIG DATA/PYTHON

[PYTHON] Flask에서 OAuth 2.0을 활용한 소셜 로그인 (Google, Kakao)

by 라일리T 2025. 3. 10.

Flask에서 OAuth 2.0을 활용한 소셜 로그인 (Google, Kakao)

이전 글에서는 JWT와 Refresh Token을 활용한 로그인 유지 방법을 배웠습니다.
이번에는 OAuth 2.0을 이용해 Google 및 Kakao 소셜 로그인을 구현해 보겠습니다.

OAuth 2.0 개념 및 동작 방식
Flask에서 Google 로그인 구현
Flask에서 Kakao 로그인 구현

 

 

[PYTHON] Flask에서 Refresh Token을 활용한 JWT 자동 갱신

Flask에서 Refresh Token을 활용한 JWT 자동 갱신이전 글에서는 JWT(JSON Web Token)를 이용한 로그인 유지 방법을 배웠습니다.하지만 JWT는 만료 기한이 설정되어 있어 일정 시간이 지나면 재로그인이 필요

englishforkid.tistory.com

 


1. OAuth 2.0이란?

OAuth 2.0은 타사 서비스(Google, Kakao 등)를 통해 인증을 제공하는 프로토콜입니다.
이를 활용하면 사용자가 비밀번호를 직접 입력하지 않고 로그인 가능합니다.

🔹 OAuth 2.0 로그인 흐름
1️⃣ 사용자가 Google/Kakao 로그인 버튼 클릭
2️⃣ OAuth 인증 서버로 리디렉트 → 로그인 진행
3️⃣ 로그인 성공 시 Access Token 발급
4️⃣ Access Token을 사용해 사용자 정보 요청
5️⃣ 사용자 정보(DB 저장 또는 JWT 발급 후 로그인 유지)


2. Google 로그인 구현

📌 1) Google OAuth 설정

1️⃣ Google Cloud Console 접속
2️⃣ 새 프로젝트 생성
3️⃣ OAuth 2.0 동의 화면 설정
4️⃣ OAuth 클라이언트 ID 생성

  • 애플리케이션 유형: 웹 애플리케이션
  • 승인된 리디렉트 URI: http://localhost:5000/auth/google/callback
    5️⃣ 클라이언트 ID 및 클라이언트 시크릿 복사

📌 Flask 환경 설정 (config.py)

GOOGLE_CLIENT_ID = "YOUR_GOOGLE_CLIENT_ID"
GOOGLE_CLIENT_SECRET = "YOUR_GOOGLE_CLIENT_SECRET"
GOOGLE_REDIRECT_URI = "http://localhost:5000/auth/google/callback"

📌 2) Google 로그인 요청

📌 OAuth 인증 URL 생성 (app.py)

from flask import Flask, redirect, request, jsonify
import requests
import os

app = Flask(__name__)
app.config.from_pyfile("config.py")

GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/auth"
GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token"
GOOGLE_USERINFO_URL = "https://www.googleapis.com/oauth2/v2/userinfo"

@app.route("/auth/google")
def google_login():
    """Google 로그인 요청"""
    params = {
        "client_id": app.config["GOOGLE_CLIENT_ID"],
        "redirect_uri": app.config["GOOGLE_REDIRECT_URI"],
        "response_type": "code",
        "scope": "openid email profile",
    }
    auth_url = f"{GOOGLE_AUTH_URL}?{'&'.join([f'{k}={v}' for k, v in params.items()])}"
    return redirect(auth_url)

사용자를 Google 로그인 페이지로 리디렉트
✅ 로그인 성공 시 code 값을 받아 callback URL로 리디렉트됨


📌 3) Access Token 및 사용자 정보 요청

📌 Access Token 요청 및 사용자 정보 가져오기 (app.py)

@app.route("/auth/google/callback")
def google_callback():
    """Google 로그인 콜백 처리"""
    code = request.args.get("code")

    # Access Token 요청
    token_data = {
        "client_id": app.config["GOOGLE_CLIENT_ID"],
        "client_secret": app.config["GOOGLE_CLIENT_SECRET"],
        "redirect_uri": app.config["GOOGLE_REDIRECT_URI"],
        "code": code,
        "grant_type": "authorization_code"
    }
    token_response = requests.post(GOOGLE_TOKEN_URL, data=token_data)
    token_json = token_response.json()
    access_token = token_json.get("access_token")

    # 사용자 정보 요청
    headers = {"Authorization": f"Bearer {access_token}"}
    user_response = requests.get(GOOGLE_USERINFO_URL, headers=headers)
    user_info = user_response.json()

    return jsonify(user_info)

Google에서 code 값을 받아 Access Token 요청
Access Token을 이용해 사용자 정보 가져오기


3. Kakao 로그인 구현

📌 1) Kakao OAuth 설정

1️⃣ 카카오 개발자 콘솔 접속
2️⃣ 애플리케이션 등록
3️⃣ Redirect URI 추가: http://localhost:5000/auth/kakao/callback
4️⃣ REST API 키 복사

📌 Flask 환경 설정 (config.py)

KAKAO_CLIENT_ID = "YOUR_KAKAO_CLIENT_ID"
KAKAO_REDIRECT_URI = "http://localhost:5000/auth/kakao/callback"
KAKAO_AUTH_URL = "https://kauth.kakao.com/oauth/authorize"
KAKAO_TOKEN_URL = "https://kauth.kakao.com/oauth/token"
KAKAO_USERINFO_URL = "https://kapi.kakao.com/v2/user/me"

📌 2) Kakao 로그인 요청

📌 OAuth 인증 URL 생성 (app.py)

@app.route("/auth/kakao")
def kakao_login():
    """Kakao 로그인 요청"""
    params = {
        "client_id": app.config["KAKAO_CLIENT_ID"],
        "redirect_uri": app.config["KAKAO_REDIRECT_URI"],
        "response_type": "code",
    }
    auth_url = f"{KAKAO_AUTH_URL}?{'&'.join([f'{k}={v}' for k, v in params.items()])}"
    return redirect(auth_url)

사용자를 Kakao 로그인 페이지로 리디렉트


📌 3) Access Token 및 사용자 정보 요청

📌 Access Token 요청 및 사용자 정보 가져오기 (app.py)

@app.route("/auth/kakao/callback")
def kakao_callback():
    """Kakao 로그인 콜백 처리"""
    code = request.args.get("code")

    # Access Token 요청
    token_data = {
        "client_id": app.config["KAKAO_CLIENT_ID"],
        "redirect_uri": app.config["KAKAO_REDIRECT_URI"],
        "code": code,
        "grant_type": "authorization_code"
    }
    token_response = requests.post(KAKAO_TOKEN_URL, data=token_data)
    token_json = token_response.json()
    access_token = token_json.get("access_token")

    # 사용자 정보 요청
    headers = {"Authorization": f"Bearer {access_token}"}
    user_response = requests.post(KAKAO_USERINFO_URL, headers=headers)
    user_info = user_response.json()

    return jsonify(user_info)

Kakao에서 code 값을 받아 Access Token 요청
Access Token을 이용해 사용자 정보 가져오기


4. 클라이언트에서 소셜 로그인 사용

📌 Google 로그인 요청

GET /auth/google

📌 Kakao 로그인 요청

GET /auth/kakao

📌 서버 응답 (로그인 성공 시 사용자 정보 반환)

{
    "id": "123456789",
    "email": "user@example.com",
    "name": "John Doe"
}

5. 결론

이번 글에서는 Flask에서 OAuth 2.0을 활용한 Google/Kakao 소셜 로그인을 구현했습니다.

OAuth 2.0의 개념과 로그인 흐름
Flask에서 Google/Kakao 로그인 구현
Access Token을 이용한 사용자 정보 가져오기

다음 글에서는 Flask에서 이메일 인증을 통한 회원가입 시스템 구축을 다루겠습니다! 🚀