JWT 발급 방법은 공식 문서에 아주 친절하고 상세하게 적혀져 있다.
반드시 참고할 것!
https://fastapi.tiangolo.com/tutorial/security/oauth2-jwt/
나는 JWT로 인증 절차를 밟고있다.
JWT 토큰을 발행하려면 우선적으로 입력받은 아이디/비밀번호와 DB에 저장되어있는 아이디/비밀번호가 일치하는지 확인해야 한다.
def verify_password(self, password: str, user_password: str) -> bool:
return pwd_context.verify(password, user_password)
이 코드에서 verify
메서드는 입력 받은 password와 DB에 hash되어 저장된 password가 같은지 확인해준다.
pwd_context.hash(password) == user_password
물론 이런식으로 해도 동작은 한다. 하지만 verify를 이용하면 바로 True, False가 나온다.
그런데 내 코드에서는 verify가 원하는대로 동작하지 않았음.
심지어 공식문서를 보고 그대로 따라해도 verify에서 비밀번호가 틀리다고 나왔다.
그 이유는..!
if valid_password.success is True:
user_body.password = pwd_context.hash(user_body.password)
...(생략)...
return self.userRepository.create(
User(
....
password=pwd_context.hash(user_body.password),
바로 이부분 때문이었다… 코드를 제대로 모르고 쓰다보니 password의 유효성 검사를 통과한 뒤 hash를 해주고, user값을 파라미터 보내줄 때 또 한번 hash를 해주었다.
결국 hash를 두번이나 해주다보니 verify가 먹지 않았다.
hash하는 부분을 하나만 변경해주니 제대로 동작되었다.
오늘 JWT 토큰을 발급하는 코드들에 대해 제대로 정리해보는 시간을 갖게되어 매우 기분이 좋다. 그리고 에러를 고쳐서 더 기분 좋다😊