Flask 에서는 로그인 시 JWT 인증을 위해서 몇 가지 라이브러리를 제공하고 있다. 그 중에서 bcrypt, PyJWT를 사용해서 구현해보고 이론을 복습하자.
pip install bcrypt
pip install pyjwt
import bcrypt
password = "password"
encrypted_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
print(encrypted_password) # bytes-string
print(encrypted_password.decode("utf-8")) # str 객체
b'$2b$12$6XEOimJ6msiHK7w/r7ayoO5W14cOVPLl8BPvmjhPJTWuo5RGRR.W6'
$2b$12$6XEOimJ6msiHK7w/r7ayoO5W14cOVPLl8BPvmjhPJTWuo5RGRR.W6
암호화를 하기 위한 패스워드(사용자가 입력한 패스워드)가 주어지면 bcrypt.hashpw()를 통해서 인코딩한다.
bcrypt.hashpw() 함수는 두 개의 파라미터를 가진다.
1. UTF-8 형식으로 인코딩 된 bytes-string을 입력받는다.
2. 해싱 기법을 넣는다.
여기서 bcrypt.gensalt()는 솔팅 기법으로 기존 해싱 기법에 소금을 뿌리듯(salting) 해싱할 때 임의의 문자를 추가해서 해싱하는 보안을 위한 과정을 첨가하여 더욱 안전하게 암호화하기 위한 기법이다.
기존 해싱 방법

Salt 임의의 문자를 추가해서 해쉬하는 방법


import bcrypt
encrypted_password = bcrypt.hashpw("password".encode("utf-8"), bcrypt.gensalt())
print(bcrypt.checkpw("password".encode("utf-8"), encrypted_password)) # True
print(bcrypt.checkpw("pessword".encode("utf-8"), encrypted_password)) # False
bcrypt 까지는 패스워드를 암호화 시키기 위해 편하게 사용할 수 있는 라이브러리 였으면 PyJWT는 Python 으로 JWT를 생성하는 데에 도움을 주는 모듈이다.
import jwt
json = {
"id": "cadqe13",
"pw": "pw"
}
encoded = jwt.encode(json, "secret", algorithm="HS256") # str
decoded = jwt.decode(encoded, "secret", algorithms="HS256") # dict
print(encoded)
print(decoded)
# encoded
b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6Imp1c3Rrb2RlIiwicGFzc3dvcmQiOiJwYXNzd29yZCJ9.TKGlCElSgGthalfeTlbN_giphG9AC5y5HwCbz93N0cs'
# decoded
{'id': 'cadqe13', 'password': 'pw'}
JWT Encoding
JWT Decoding
원문 링크에 전체 소스 코드를 제공하고 있습니다.


Postman으로 확인해보면 내가 입력한 회원 정보를 기반으로 토큰 값이 생성되는 것을 볼 수 있다.


로그인할 때도 토큰이 제공되고 인증이 필요한 단계에서 헤더에 토큰을 실어보내주면 인증이 된다.

https://justkode.kr/python/flask-restapi-3
https://st-lab.tistory.com/100