[TIL]Backend Auth

박현희·2020년 10월 13일
0

인증,인가 실습1 순서

1.인증 구현 전 비밀번호 암호화를 진행

1-1.암호화 라이브러리 bcrypt 설치

pip install bcrypt

1-2.설치 후 python 인터프리터 실행

실행하고 라이브러리 import

import bcrypt

1-3.암호화

⭐️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'
#암호화 된 비밀번호를 얻었다. data type은 bites

type(hashed_password)
# <class 'bytes'>

이렇게 암호화된 방식은 일방향 암호화로 복호화 할 수 없도록 암호화하는 방식이다.

1-4.비밀번호 확인

양방향으로 확인이 불가능하지만 bcrypt의 bcrypt.checkpw() 메소드로 비밀번호 확인이 가능하다.

new_password = '1234'
bcrypt.checkpw(new_password.encode('utf-8'),hashed_password)
#True

단 이 메소드에는 규칙이 있다.
bcrypt.checkpw() 메소드의 괄호에 들어가는 (입력받은 패스워드, 저장된 암호화된 패스워드)의
데이터 타입이 모두 Bytes 여야 한다.

2.인증 수단인 JWT구현

2-1.라이브러리 설치

pip install pyjwt

2-2.python 인터프리터 실행

import jwt

2-3.token 만들기

SECRET = 'secret' #'랜덤한 조합의 키' 예제이므로 단순하게 'secret'이라고 하겠습니다.

access_token = jwt.encode({'id' : 1}, SECRET, algorithm = 'HS256')
print(access_token)
#b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.-xXA0iKB4mVNvWLYFtt2xNiYkFpObF54J9lj2RwduAI'

이제 인증을 위한 매개체를 만든건데 이게 바로 jwt token 일명 access_token이다.
이렇게 발급된 토큰은 다시 decode해서 json형태로 프론트엔드에 보내준다.

2-4.token 확인

그 후에 프론트엔드에 저장 되어있던 토큰을 백엔드에 보내주면 인증을 통과한 사용자만 접근할 수 있도록
우리가 발행한 토큰인지 확인해야한다.

이 경우는 양방향 암호화로 복호화가 가능하다.

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

decode의 결과는 우리가 encode 할 때 넘겼던 header 값인 {'id':1}입니다.

0개의 댓글