From f153157227922d27e791de58c72ce7dab0626946 Mon Sep 17 00:00:00 2001 From: hbyang Date: Fri, 30 Jan 2026 10:13:50 +0900 Subject: [PATCH] =?UTF-8?q?jwt=20token=20timezone=20=EB=B3=80=EA=B2=BD=20.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/api/routers/v1/home.py | 11 +++++++++++ app/user/services/auth.py | 10 +++++----- app/user/services/jwt.py | 10 +++++----- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/home/api/routers/v1/home.py b/app/home/api/routers/v1/home.py index 3c8e175..a1e48f8 100644 --- a/app/home/api/routers/v1/home.py +++ b/app/home/api/routers/v1/home.py @@ -400,6 +400,17 @@ async def _autocomplete_logic(autocomplete_item:dict): status_code=status.HTTP_502_BAD_GATEWAY, detail="자동완성 place id 추출 실패", ) + + if not new_url: + step1_elapsed = (time.perf_counter() - step1_start) * 1000 + logger.error( + f"[crawling] Autocomplete FAILED - URL을 찾을 수 없음 ({step1_elapsed:.1f}ms)" + ) + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="해당 장소의 네이버 지도 URL을 찾을 수 없습니다.", + ) + return new_url def _extract_image_name(url: str, index: int) -> str: diff --git a/app/user/services/auth.py b/app/user/services/auth.py index c63c88a..1071ff7 100644 --- a/app/user/services/auth.py +++ b/app/user/services/auth.py @@ -5,7 +5,7 @@ """ import logging -from datetime import datetime, timezone +from datetime import datetime from typing import Optional from sqlalchemy import select, update @@ -113,7 +113,7 @@ class AuthService: logger.debug(f"[AUTH] 리프레시 토큰 저장 완료 - user_id: {user.id}, user_uuid: {user.user_uuid}") # 7. 마지막 로그인 시간 업데이트 - user.last_login_at = datetime.now(timezone.utc) + user.last_login_at = datetime.now() await session.commit() redirect_url = f"{prj_settings.PROJECT_DOMAIN}" @@ -168,7 +168,7 @@ class AuthService: if db_token.is_revoked: raise TokenRevokedError() - if db_token.expires_at < datetime.now(timezone.utc): + if db_token.expires_at < datetime.now(): raise TokenExpiredError() # 4. 사용자 확인 @@ -428,7 +428,7 @@ class AuthService: .where(RefreshToken.token_hash == token_hash) .values( is_revoked=True, - revoked_at=datetime.now(timezone.utc), + revoked_at=datetime.now(), ) ) await session.commit() @@ -453,7 +453,7 @@ class AuthService: ) .values( is_revoked=True, - revoked_at=datetime.now(timezone.utc), + revoked_at=datetime.now(), ) ) await session.commit() diff --git a/app/user/services/jwt.py b/app/user/services/jwt.py index e8b3bce..12b60c6 100644 --- a/app/user/services/jwt.py +++ b/app/user/services/jwt.py @@ -5,7 +5,7 @@ Access Token과 Refresh Token의 생성, 검증, 해시 기능을 제공합니 """ import hashlib -from datetime import datetime, timedelta, timezone +from datetime import datetime, timedelta from typing import Optional from jose import JWTError, jwt @@ -23,7 +23,7 @@ def create_access_token(user_uuid: str) -> str: Returns: JWT 액세스 토큰 문자열 """ - expire = datetime.now(timezone.utc) + timedelta( + expire = datetime.now() + timedelta( minutes=jwt_settings.JWT_ACCESS_TOKEN_EXPIRE_MINUTES ) to_encode = { @@ -48,7 +48,7 @@ def create_refresh_token(user_uuid: str) -> str: Returns: JWT 리프레시 토큰 문자열 """ - expire = datetime.now(timezone.utc) + timedelta( + expire = datetime.now() + timedelta( days=jwt_settings.JWT_REFRESH_TOKEN_EXPIRE_DAYS ) to_encode = { @@ -104,9 +104,9 @@ def get_refresh_token_expires_at() -> datetime: 리프레시 토큰 만료 시간 계산 Returns: - 리프레시 토큰 만료 datetime (UTC) + 리프레시 토큰 만료 datetime (로컬 시간) """ - return datetime.now(timezone.utc) + timedelta( + return datetime.now() + timedelta( days=jwt_settings.JWT_REFRESH_TOKEN_EXPIRE_DAYS )