Flask : JWT 로그인 구현

cad·2022년 4월 20일
0

Flask

목록 보기
2/2
post-thumbnail

Flask + JWT

Flask 에서는 로그인 시 JWT 인증을 위해서 몇 가지 라이브러리를 제공하고 있다. 그 중에서 bcrypt, PyJWT를 사용해서 구현해보고 이론을 복습하자.

설치

pip install bcrypt
pip install pyjwt

bcrypt

암호화 방법

  • 예제
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

How?

  • 암호화를 하기 위한 패스워드(사용자가 입력한 패스워드)가 주어지면 bcrypt.hashpw()를 통해서 인코딩한다.

  • bcrypt.hashpw() 함수는 두 개의 파라미터를 가진다.
    1. UTF-8 형식으로 인코딩 된 bytes-string을 입력받는다.
    2. 해싱 기법을 넣는다.

여기서 bcrypt.gensalt()는 솔팅 기법으로 기존 해싱 기법에 소금을 뿌리듯(salting) 해싱할 때 임의의 문자를 추가해서 해싱하는 보안을 위한 과정을 첨가하여 더욱 안전하게 암호화하기 위한 기법이다.

  • 기존 해싱 방법

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

  • 최종적으로 이렇게 활용할 수 있다.
    • 해싱된 암호 문자열 + Salt 임의 문자열을 N 차례 해싱한다.
    • 그렇게 생성된 Digest는 복호화하기 힘들기 때문에 보안성이 상승한다.
    • *브루트포스 공격을 방어하기에도 좋다.
      • 비밀번호를 하나 하나 다 입력해보는 무차별 대입 공격

암호 일치 확인 방법

  • bcrypt의 checkpw() 함수를 사용한다. hashpw()와 마찬가지로 password를 utf-8로 encoding 해서 bytes-string으로 만든 값과 salting 기법으로 해싱한 다이제스트가 같은지 비교하고 참/거짓 을 리턴한다.
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

PyJWT

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

  • 회원 정보를 인코딩 하기 위해서 json 객체, 시크릿 키, 암호화 알고리즘 방식을 파라미터로 인코딩을 실시한다.

JWT Decoding

  • 반대로 decoding하고자 하는 str 객체, 시크릿 키, 알고리즘으로 디코딩하면 된다.

테스트 해보자

원문 링크에 전체 소스 코드를 제공하고 있습니다.

회원 가입 로직

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

로그인 로직

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


잡담

  • 플라스크에서 JWT를 구현하는게 라이브러리가 잘 갖춰져 있어서 되게 편했다. 편하고 강력한 기능인 만큼 JWT가 뭐고 왜 사용하는지, 세션 기반 인증 시스템이랑 다른게 뭔지,, 장단점이 뭔지,, 다시 한번 공부를 하는게 좋겠다

Ref.

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

profile
Dare mighty things!

0개의 댓글