Flask에서 Refresh Token을 활용한 JWT 자동 갱신
이전 글에서는 JWT(JSON Web Token)를 이용한 로그인 유지 방법을 배웠습니다.
하지만 JWT는 만료 기한이 설정되어 있어 일정 시간이 지나면 재로그인이 필요합니다.
이를 해결하기 위해 Refresh Token을 활용한 자동 로그인 갱신 기능을 구현하겠습니다.
✅ Access Token vs Refresh Token
✅ Refresh Token을 이용한 JWT 갱신 방식
✅ Flask에서 Refresh Token을 활용한 구현
[PYTHON] Flask에서 JWT(JSON Web Token)를 활용한 로그인 유지하기
Flask에서 JWT(JSON Web Token)를 활용한 로그인 유지하기이전 글에서는 이메일 인증 시스템을 구축하여, 사용자가 이메일을 통해 계정을 활성화하도록 만들었습니다.이번 글에서는 JWT(JSON Web Token)를
englishforkid.tistory.com
1. Access Token과 Refresh Token의 차이
Token 유형 | 용도 | 만료 시간 |
Access Token | API 요청 시 인증 | 짧음 (1시간 이내) |
Refresh Token | 새로운 Access Token 발급 | 김 (일반적으로 7~30일) |
📌 Access Token → 사용자가 API 요청 시 보내는 토큰 (짧은 만료 시간)
📌 Refresh Token → 새로운 Access Token을 발급하는 데 사용 (더 긴 만료 시간)
2. Flask에서 Refresh Token을 활용한 JWT 갱신
📌 Flask 환경 설정
pip install PyJWT flask
📌 JWT 설정 (config.py)
import os
SECRET_KEY = os.urandom(24)
JWT_ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRATION = 3600 # 1시간
REFRESH_TOKEN_EXPIRATION = 2592000 # 30일
✅ ACCESS_TOKEN_EXPIRATION = 3600 → Access Token 만료 기한 (1시간)
✅ REFRESH_TOKEN_EXPIRATION = 2592000 → Refresh Token 만료 기한 (30일)
3. Access Token & Refresh Token 생성
📌 토큰 생성 (utils.py)
import jwt
import datetime
from flask import current_app
def generate_access_token(user_id):
"""Access Token 생성 (1시간 유효)"""
payload = {
"user_id": user_id,
"exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=current_app.config["ACCESS_TOKEN_EXPIRATION"])
}
return jwt.encode(payload, current_app.config["SECRET_KEY"], algorithm=current_app.config["JWT_ALGORITHM"])
def generate_refresh_token(user_id):
"""Refresh Token 생성 (30일 유효)"""
payload = {
"user_id": user_id,
"exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=current_app.config["REFRESH_TOKEN_EXPIRATION"])
}
return jwt.encode(payload, current_app.config["SECRET_KEY"], algorithm=current_app.config["JWT_ALGORITHM"])
def verify_token(token):
"""토큰 검증"""
try:
payload = jwt.decode(token, current_app.config["SECRET_KEY"], algorithms=[current_app.config["JWT_ALGORITHM"]])
return payload["user_id"]
except jwt.ExpiredSignatureError:
return None # 토큰 만료
except jwt.InvalidTokenError:
return None # 잘못된 토큰
✅ generate_access_token(user_id) → 1시간짜리 Access Token 생성
✅ generate_refresh_token(user_id) → 30일짜리 Refresh Token 생성
✅ verify_token(token) → 토큰 검증 후 사용자 ID 반환
4. 로그인 시 Refresh Token 저장
📌 로그인 시 Access Token & Refresh Token 발급 (app.py)
from flask import Flask, request, jsonify
import sqlite3
app = Flask(__name__)
app.config.from_pyfile("config.py")
@app.route("/login", methods=["POST"])
def login():
data = request.json
email = data.get("email")
password = data.get("password")
conn = sqlite3.connect("users.db")
cursor = conn.cursor()
cursor.execute("SELECT id, verified FROM users WHERE email = ? AND password = ?", (email, password))
user = cursor.fetchone()
conn.close()
if user:
user_id, verified = user
if not verified:
return jsonify({"error": "이메일 인증이 필요합니다."}), 400
access_token = generate_access_token(user_id)
refresh_token = generate_refresh_token(user_id)
return jsonify({"access_token": access_token, "refresh_token": refresh_token})
return jsonify({"error": "이메일 또는 비밀번호가 잘못되었습니다."}), 401
✅ 로그인 성공 시 Access Token + Refresh Token을 함께 반환
✅ 클라이언트는 Refresh Token을 안전하게 저장 (HTTPOnly Cookie 등 활용)
5. 만료된 Access Token 갱신 (Refresh Token 사용)
📌 토큰 갱신 엔드포인트 (app.py)
@app.route("/refresh", methods=["POST"])
def refresh():
data = request.json
refresh_token = data.get("refresh_token")
user_id = verify_token(refresh_token)
if not user_id:
return jsonify({"error": "유효하지 않은 Refresh Token입니다."}), 401
new_access_token = generate_access_token(user_id)
return jsonify({"access_token": new_access_token})
✅ 만료된 Access Token을 갱신할 때, Refresh Token을 사용
✅ verify_token(refresh_token) → Refresh Token 검증 후 새로운 Access Token 발급
6. 클라이언트에서 JWT 사용 흐름
📌 로그인 시 토큰 저장
POST /login
{
"email": "user@example.com",
"password": "mypassword"
}
📌 서버 응답
{
"access_token": "eyJhbGciOiJI...",
"refresh_token": "eyJhbGciOiJI..."
}
✅ Access Token은 API 요청 시 사용
✅ Refresh Token은 만료된 Access Token 갱신 시 사용
📌 인증된 요청 보내기
GET /profile HTTP/1.1
Authorization: Bearer eyJhbGciOiJI...
📌 만료된 Access Token 사용 시 응답
{
"error": "유효하지 않은 토큰입니다."
}
✅ 클라이언트는 새로운 Access Token을 발급받아야 함
📌 Refresh Token으로 Access Token 갱신
POST /refresh
{
"refresh_token": "eyJhbGciOiJI..."
}
📌 서버 응답 (새로운 Access Token 발급)
{
"access_token": "new_eyJhbGciOiJI..."
}
✅ 새 Access Token을 받아서 다시 API 요청 진행
7. 결론
이번 글에서는 Flask에서 Refresh Token을 활용한 JWT 자동 갱신을 구현했습니다.
✅ Access Token과 Refresh Token의 개념
✅ 로그인 시 Refresh Token 함께 발급
✅ 만료된 Access Token을 Refresh Token으로 갱신
다음 글에서는 Flask에서 OAuth 2.0을 활용한 소셜 로그인 (Google, Kakao) 구현을 다루겠습니다! 🚀
[PYTHON] Flask를 이용한 간단한 웹 애플리케이션 만들기
Flask를 이용한 간단한 웹 애플리케이션 만들기 이전 글에서는 자동 이메일 발송 기능을 구현해 보았습니다.이제 Python을 활용하여 간단한 웹 애플리케이션을 만들어 보겠습니다.웹 애플리케이
englishforkid.tistory.com
[PYTHON] 파이썬 기초: 변수와 데이터 타입 이해하기
파이썬 기초: 변수와 데이터 타입 이해하기 파이썬을 배우면서 가장 먼저 익혀야 할 개념 중 하나가 변수(variable)와 데이터 타입(data type) 입니다. 변수를 사용하면 데이터를 저장하고 조작할 수
englishforkid.tistory.com
[자격증 정보] 2025년 COS Pro 자격증 완벽 가이드, 시험 개요, 일정, 준비방법
COS Pro 자격증 완벽 가이드: 시험 개요, 일정 및 준비 방법 COS Pro(Coding Specialist Professional)는 YBM에서 주관하는 코딩 전문가 자격시험으로, C, C++, C#, JAVA, Python 등 다양한 프로그래밍 언어에 대한 높
englishforkid.tistory.com
'BIG DATA > PYTHON' 카테고리의 다른 글
[파이썬 기초] 초보자를 위한 파이썬 변수 선언과 할당 완벽 가이드 (0) | 2025.03.13 |
---|---|
[PYTHON] Flask에서 OAuth 2.0을 활용한 소셜 로그인 (Google, Kakao) (0) | 2025.03.10 |
[PYTHON] Flask에서 JWT(JSON Web Token)를 활용한 로그인 유지하기 (0) | 2025.03.07 |
[PYTHON] Flask에서 이메일 인증 구현하기 (0) | 2025.03.04 |
[PYTHON] Flask에서 파일 업로드 및 프로필 사진 등록하기 (0) | 2025.03.01 |