파이썬 FastAPI와 JWT를 이용한 사용자 비밀번호 재설정 시스템 구현

서론

사용자 비밀번호 재설정은 보안적인 이유로 매우 중요한 기능입니다. 이 기능을 구현하기 위해 파이썬 FastAPI 프레임워크와 JWT(JSON Web Tokens)를 사용할 수 있습니다. JWT는 사용자 인증에 매우 유용한 방법으로, 비밀번호 재설정 시스템에서도 사용될 수 있습니다. 이 글에서는 FastAPI와 JWT를 이용하여 사용자 비밀번호 재설정 시스템을 구현하는 방법에 대해 알아보겠습니다.

사전 준비

비밀번호 재설정 시스템을 구현하기 전에 몇 가지 사전 준비 작업을 해야합니다.

  1. FastAPI 설치하기:
    pip install fastapi
    
  2. PyJWT 설치하기:
    pip install pyjwt
    

사용자 비밀번호 재설정 시스템 구현

비밀번호 재설정 시스템은 사용자가 이메일을 통해 비밀번호 재설정 링크를 요청하면, 서버에서 해당 사용자의 이메일 주소를 확인하고 JWT를 생성하여 이메일로 전송합니다. 사용자는 이메일에 포함된 링크를 클릭하여 비밀번호 재설정 페이지로 이동하고, 새 비밀번호를 입력하여 저장할 수 있습니다. 이제 이 과정을 코드로 구현해보겠습니다.

  1. FastAPI 앱 설정

    from fastapi import FastAPI
    
    app = FastAPI()
    
  2. 비밀번호 재설정 요청 엔드포인트 구현

    from fastapi import HTTPException
    
    @app.post("/password/reset")
    def request_password_reset(email: str):
        # 이메일 주소 확인 로직 추가
    
        # JWT 생성
        jwt_token = create_jwt(email)
    
        # 이메일 전송 로직 추가
    
  3. JWT 생성 함수 구현

    from datetime import datetime, timedelta
    import jwt
    
    def create_jwt(email: str):
        # 만료 시간 설정 (예: 1시간 후)
        expires = datetime.utcnow() + timedelta(hours=1)
    
        # JWT 생성
        jwt_payload = {
            "email": email,
            "exp": expires
        }
        jwt_token = jwt.encode(jwt_payload, "secret-key", algorithm="HS256")
    
        return jwt_token
    
  4. 비밀번호 재설정 엔드포인트 구현

    from fastapi import Depends
    
    @app.post("/password/reset/{token}")
    def reset_password(token: str, new_password: str):
        # JWT 검증
        email = verify_jwt(token)
    
        # 새 비밀번호 저장 로직 추가
    
        return {"message": "비밀번호 재설정 성공"}
    
    def verify_jwt(token: str):
        try:
            jwt_payload = jwt.decode(token, "secret-key", algorithms=["HS256"])
            email = jwt_payload.get("email")
            return email
        except jwt.ExpiredSignatureError:
            raise HTTPException(status_code=400, detail="JWT 토큰이 만료되었습니다.")
        except jwt.InvalidTokenError:
            raise HTTPException(status_code=400, detail="유효하지 않은 JWT 토큰입니다.")
    
  5. API 실행

    if __name__ == "__main__":
        import uvicorn
    
        uvicorn.run(app, host="0.0.0.0", port=8000)
    

마치며

이제 FastAPI와 JWT를 이용하여 사용자 비밀번호 재설정 시스템을 구현하는 방법을 알아보았습니다. 이를 통해 보안적인 측면에서 안전한 비밀번호 재설정 기능을 제공할 수 있습니다. FastAPI는 빠른 개발을 위한 강력한 기능을 제공하며, JWT는 사용자 인증과 관련된 다양한 기능을 구현하기에 용이한 도구입니다.