(TIL19) 회원가입/로그인 인증인가

SooHyung Kim·2020년 4월 18일
0

django

목록 보기
4/5

인증/인가

  • 상세내용은 지난 인증/인가 포스팅 참고(인증/인가)

  • 회원가입과 로그인 시에 고객이 입력한 비밀번호는 절대로 유출되면 안되는 핵심요소로 다음과 같은 절차가 필요

    1. 회원가입 시 입력한 고객의 패스워드는 암호화되어 저장되어야 함
      (저장 시에는 이진화된 암호를 디코딩하여 저장)
    2. 로그인 시에는 입력된 패스워드와 데이터베이스에 저장된 암호를 비교
    3. 비교값이 True일 경우 Response로 Json 형식의 토큰을 전달
  • 위의 내용을 토대로 기존의 로그인/패스워드 뷰를 수정

Bcrypt & JWT

  • bctypt는 패스워드 암호화에 특화된 함수로, 암호화를 진행하기 위해 bcrypt를 import

  • bcrypt.hashpw

    • 현재 입력된 패스워드의 인코딩(이진화) 후 Salting을 하여 Key stretching을 진행

    • 데이터베이스에 저장하기 위해 암호화된 패스워드의 디코딩(이진화 해제)을 진행

import json

hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
  • bcrypt.checkpw

    • 현재 입력된 패스워드와 데이터베이스에 저장된 패스워드를 서로 인코딩하여 비교

    • 비교값이 True일 경우 access token을 발행

  • PyJWT

pip install pyJWT

import jwt
  • jwt.encode(payload, key, algorithm)

    • payload : 개인을 식별하는 정보로 암호화 되는 것이 아니라 단순히 이진화되는 과정이기 때문에 아이디, 패스워드와 같은 개인정보로 payload를 설정하는 것은 매우 부적절(보통은 id를 지정)

    • key : 시크릿 키를 지정(settings.py의 SETRET_KEY 등)

    • algorithm : 현재 주로 사용하는 HS256을 설정하면 무난함

if bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')):
    access_token = jwt.encode({'id' : user.id}, 'secret', algorithm = 'HS256')
return JsonResponse({"access-token" : access_token.decode('utf-8')}, status=200)
profile
Slow and steady win the race

0개의 댓글