TIL - Wecode | Bcrypt & JWT

한성봉·2021년 6월 2일
0

Bcrypt & JWT

Bcrypt

인증 인가는 프론트와 백엔드 간의 상호 작용이다. 인증 구현에 앞서, 개인정보의 보호를 위해 필수적으로 해야하는 요소인 비밀번호 암호화를 알아보자.

우선 암호화를 위해 Bcrypt 라이브러리를 설치한다.

pip install bcrypt

이후 터미널에서 파이썬 인터프리터를 열고 실습해보자..

import bcrypt

bcrypt의 암호화 방법

Bcrypt는 str데이터가 아닌 bytes 데이터를 암호화 한다. 따라서 암호화시 bytes화 해야한다. 파이썬에서는 str 을 encode 하면 bytes 이진화 되고 bytes 를 decode 하면 str화 한다. encode, decode 시에는 우리가 인식할 수 있는 형태로 변환하기 위해 utf-8 유니코드 문자 규격을 사용한다.

password = '1234'
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
print(hashed_password)
# b'$2b$12$YFs9rh.1LgJwZuf9ibyjpuLvBoCaGX0MzedFWF2Jo0zU3lMZurZ4a'

맨 앞의 b는 bytes화 됐다는 의미이다. type함수를 이용해 hashed_password의 타입을 알아보자.

type(hashed_password)
# <class 'bytes'>

이렇게 암호화된 방식은 일방향 암호화 즉 복호화 할 수 없도록 암호화하는 방식이다.
비밀번호를 확인하는 작업을 해보자.

new_password = '1234'
bcrypt.checkpw(new_password.encode('utf-8'),hashed_password)
# bcrypt.checkpw(입력받은 password, 암호화된 password)
# True

bcrypt.checkpw() 메서드가 비밀번호를 확인하는 역할을 하고 있다.
비교하는 두 password의 데이터 타입은 bytes이어야 합니다.

이 로직을 장고에 적용해 로그인 기능을 구현할 때 활용하면 되겠다.

JWT (JSON Web Token)

PyJWT 라이브러리 설치

pip install pyjwt
# python 인터프리터
import jwt
SECRET = 'secret'
access_token = jwt.encode({'id': 1}, SECRET, algorithm = 'HS256')
print(accsee_token)
# 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.-xXA0iKB4mVNvWLYFtt2xNiYkFpObF54J9lj2RwduAI'

위와 같이 라이브러리를 동작시킬 수 있다.
jwt의 결과물은 pyjwt의 버전에 따라 bytes(ver. 1.7)타입 또는 str(ver. 2.0)이상 타입이다.
버전에 따라 jwt의 encode 결과의 타입에 따라 bytes -> str의 과정을 진행하면 된다.

이렇게 발급된 토큰은 프론트엔드에게 전달해야한다.
이제 인증을 위한 기본 요건을 맞췄으니, 인증을 통과한 사용자만 접근하려면 토큰을 받아서 다시 우리가 발행한 토큰이 맞는지 확인하면 된다.

header = jwt.decode(access_token, SECRET, algorithm='HS256')
print(header)
# {'id': 1}

decode 결과는 바로 우리가 encode할 때 넘겼던 header값인 {'id': 1}이다.
우리가 넘기는 header 값을 통해 유저를 식별할 수 있다는 이야기이다.

인증하는 코드는 엔드포인트에 데코레이터로 구현해야한다.
보통 user app 에 util.py를 만들어서 작성한다.

0개의 댓글