개발로 자기계발
article thumbnail
728x90
JWT를 생성하는 방법에 대해 알아보자

 

1. Python 라이브러리 설치

pip install "python-jose[cryptography"]

 

2. 라이브러리 가져오기

#OAuth2PasswordBearer 가져오기
from fastapi.security import OAuth2PasswordRequestForm, OAuth2PasswordBearer
from datetime import datetime, timedelta
from jose import jwt

※ OAuth2PasswordBearer를 가져오는 이유는 JWT가 실제로 베어 토큰 베어러 유형이기 때문이다.

 

3. 비밀키 and 알고리즘 설정

 SECRET_KEY(비밀키) 생성하기

SECRET_KEY는 위에 설정한 값과 다르게 설정해야 한다. 다음과 같은 방법으로 SECRET_KEY를 생성할 수 있다.
openssl이 설치된 터미널을 사용할 수 있다면 다음과 같이 생성하자.
$ openssl rand -hex 32 or openssl rand -hex 64

또는 다음과 같이 secrets 라이브러리를 사용할 수도 있다.
import secrets
secrets.token_hex(32)
SECRET_KEY = "생성한 secret_key 입력"
ALGORITHM = "HS256"
  • SECRET_KEY - 암호화 시 사용하는 64자리의 랜덤 한 문자열이다.
  • ALGORITHM - 토큰 생성시 사용하는 알고리즘을 의미하며 여기서는 HS256을 사용한다.

 

4. 베어러 변수 생성

Bearer는 JWT 또는 OAuth의 토큰방식을 의미

oauth2_bearer = OAuth2PasswordBearer(tokenUrl="token")

OAuth2PasswordBearer 객체를 생성할 때 tokenUrl이라는 파라미터를 넘겨준다.

이 파라미터는 프론트엔드에서 유저가 token값을 얻어 올 때 사용된다. 그리고 이 tokenUrl은 상대경로이다.

만약 API가 https://test.com/ 에 있다면 token url은 https://test.com/token 이 된다.

 

5. Token 함수 생성

def create_access_token(username: str, user_id: int, expires_delta: Optional[timedelta] = None):
    encode = {"sub": username, "id": user_id}
    if expires_delta:
        expire = datetime.utcnow() + expires_delta
    else:
        expire = datetime.utcnow() + timedelta(minutes=15)
    encode.update({"exp": expire})
    return jwt.encode(encode, SECRET_KEY, algorithm=ALGORITHM)
  • expires_delta - 토큰의 유효기간을 의미한다. 분 단위로 설정한다.

 

6. 로그인 API 수정(로그인시 토큰으로 확인)

@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(),
                                 db: Session = Depends(get_db)):
    user = authenticate_user(form_data.username, form_data.password, db)
    if not user:
        return HTTPException(status_code=404, detail="User not found")
    token_expires = timedelta(minutes=20)
    token = create_access_token(user.username,
                                user.id,
                                expires_delta=token_expires)
    return {"token": token}

 

7. Swagger 확인

기존에 만들었던 user 데이터에 대해 token이 생성되었다.

 

8. 인코딩 / 디코딩 확인

https://jwt.io/

 

728x90
SMALL
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)