반응형
액세스 토큰 (Access Token)
액세스 토큰은 사용자가 인증된 후 서버에서 발급받는 토큰으로, 주로 짧은 유효 기간을 가짐
이 토큰은 사용자가 서버에 요청을 보낼 때마다 포함되어,
서버가 사용자의 권한을 확인하고 요청을 처리하는 데 사용
리프레시 토큰 (Refresh Token)
리프레시 토큰은 액세스 토큰의 유효 기간이 만료되었을 때,
새로운 액세스 토큰을 발급받기 위해 사용되는 토큰
리프레시 토큰은 보통 엑세스토큰보다 더 긴 유효 기간을 가지며,
사용자가 다시 로그인할 필요 없이 지속적인 인증을 제공하는 역할을 함.
작동 원리
- 로그인: 사용자가 로그인하면 서버는 액세스 토큰과 리프레시 토큰을 동시에 발급
- 토큰 저장: 클라이언트는 액세스 토큰과 리프레시 토큰을 쿠키, 세션 또는 웹 스토리지에 저장 (또는 리프레시 쿠폰을 redis나 DB에 저장하는 방법도 있음)
- 요청 시 토큰 사용: 사용자가 서버에 요청을 보낼 때마다 액세스 토큰을 포함하여 서버와 통신 (토큰으로 회원 인증)
- 토큰 검증: 서버는 액세스 토큰을 검증하여 사용자의 권한을 확인하고 요청된 데이터를 전달
- 액세스 토큰 만료: 액세스 토큰이 만료되면, 클라이언트는 리프레시 토큰을 사용하여 새로운 액세스 토큰을 요청
- 새로운 액세스 토큰 발급: 서버는 리프레시 토큰을 검증한 후, 새로운 액세스 토큰을 생성하여 클라이언트에게 전달
- 리프레시 토큰도 만료된 상태: 리프레시 토큰의 유효 기간이 만료되거나 서버에서 사용자의 인증을 폐기할 경우, 사용자는 재로그인이 필요함.
예제 코드
다음은 파이썬에서 액세스 토큰과 리프레시 토큰을 발급하고 검증하는 예제 코드
import jwt
from datetime import datetime, timedelta
# 설정 값
JWT_SECRET_KEY = 'your_secret_key'
JWT_ALGORITHM = 'HS256'
JWT_ACCESS_TOKEN_EXPIRE_MINUTES = 30
JWT_REFRESH_TOKEN_EXPIRE_DAYS = 7
# 엑세스 토큰 발급
def create_access_token(data: dict, expires_delta: timedelta = None):
to_encode = data.copy()
expire = datetime.utcnow() + (expires_delta or timedelta(minutes=JWT_ACCESS_TOKEN_EXPIRE_MINUTES))
to_encode.update({"exp": expire})
return jwt.encode(to_encode, JWT_SECRET_KEY, algorithm=JWT_ALGORITHM)
# 리프레시 토큰 발급 - 리프레시 토큰의 경우 다른 방법들을 사용해도 좋다.
def create_refresh_token(data: dict, expires_delta: timedelta = None):
to_encode = data.copy()
expire = datetime.utcnow() + (expires_delta or timedelta(days=JWT_REFRESH_TOKEN_EXPIRE_DAYS))
to_encode.update({"exp": expire})
return jwt.encode(to_encode, JWT_SECRET_KEY, algorithm=JWT_ALGORITHM)
# 토큰 검증
def decode_token(token:str):
return jwt.decode(token, JWT_SECRET_KEY, algorithm=[JWT_ALGORITHM])
# 예제 사용
data = {"sub": "user_id"}
access_token = create_access_token(data)
refresh_token = create_refresh_token(data)
print(f"Access Token: {access_token}")
print(f"Refresh Token: {refresh_token}")
사용자의 정보를 포함한 액세스 토큰과 리프레시 토큰을 생성하고, 각각의 만료 시간을 설정하여 반환합니다.
jwt라이브러리를 통해 jwt.encode() 함수를 사용하여 토큰을 생성하며,
비밀키와 알고리즘을 사용하여 서명.
* secret_key 값을 너무 쉽게 만들어서는 안됨!
728x90
반응형
'WEB' 카테고리의 다른 글
[HTML] 모바일 페이지 - 휴대폰에서 숫자 키패드로 입력 받기 (0) | 2023.05.18 |
---|---|
[HTML/Javascript] input 태그, 숫자만 입력 및 개수 제한 (0) | 2023.01.06 |
[HTML/Javascript] a 태그 새로 고침 방지 및 onclick 사용 (0) | 2023.01.06 |
[HTML/Javascript] <form> 과 <button> 태그 (0) | 2023.01.03 |