인증&인가

정현석·2020년 11월 10일
0

암호화를 위한 라이브러리 Bcrypt 를 설치합니다.

pip install bcrypt
pip install pyjwt

import bcrypt
import jwt

bcrypt 의 암호화 방법!
bctypt는 str 데이터가 아닌 Bytes 데이터를 암호화합니다.
따라서 암호화시에 bytes화 해야합니다.
파이썬에서는 str 을 encode하면 bytes(이진화) 되고, Bytes 를 decode하면 str 화 합니다.
encode, decode시에는 우리가 인식할 수 있는 형태로 변환하기 위해 'UTF-8' 유니코드 문자 규격을 사용합니다.
본격적으로 bcrypt 라이브러리를 사용하겠습니다.
먼저 패스워드를 암호화 해보겠습니다.

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

위에 코드를 작성하면 암호화된 비밀번호를 얻을 수 있습니다.
이 데이터 타입은 Bytes입니다!

예시)
hsshed_password = bcrypt.hashpw(signup_data["password"].encode('utf-8'), bcrypt.gensalt())
            hsshed_password = hsshed_password.decode('utf-8')
            # bcrypt로 암호화한 데이터(encode)를 다시 decode하여 데이터 베이스에 저장합니다. (회원가입) 

이렇게 암호화된 방식을 복호화하여 사용해야합니다.

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

이 메소드에는 규칙이 있습니다. (입력받은 패스워드, 저장된 암호화된 패스워드)

예시) 
 user =  User.objects.get(user_email = login_data["email"]) 
           # User라는 class에서 가져온 값을 비교하여 저장합니다 (class가 다를 경우)
            password = login_data["password"]
            if User.objects.filter(user_email = login_data["email"]).exists():
            # 만약 User 데이터에서 email값이 login_data값의 email값이 같고 존재할 경우에 실행됩니다.
                if bcrypt.checkpw(password.encode("utf-7"), user.user_password.encode("utf-8")):
		# bcrypt를 사용하여 checkpw 합니다. 서로 비교하여 값이 동일한지만 확인합니다. (로그인)
        

자! 이제는 JSON Web Token을 구현해보겠습니다.

먼저 라이브러리를 설치한 뒤

import jwt #패키지명은 pyjwt이지만 임포트할때의 이름은 jwt입니다.

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

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

위와 같은 코드로 동작시킬 수 있습니다.
jwt의 결과물도 bytes타입입니다.

인증을 위한 매개체를 만들고 이제 프론트엔드 에게 전달해야합니다.
로그인이 성공하면 토큰하면 됩니다!

인증에 통과한 사용자만 접근하려면 토큰을 받아서 다시 우리가 발행한 토큰이 맞는지 확인해야합니다.

import jwt #패키지명은 pyjwt이지만 임포트할때의 이름은 jwt입니다.

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

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

decode결과가 우리가 encode할 때 가졌던 값입니다.
우리가 토큰에 담아 프론트엔드에게 넘기는 값으로 유저를 식별할 수 있습니다.

이제 인증하는 코드는 .......... 엔드포인트에 데코레이터를 구현해야합니다...

데코레이터의 구현은 보통 user app > utils.py를 만들어서 작성하게 됩니다.

profile
기록하는 벨로그

0개의 댓글