[Django] westargram(3)

김영환·2020년 11월 15일
0

django

목록 보기
4/5
post-thumbnail

✔️ 인증/인가

인증 Authentication

  • 유저의 아이디와 비번을 확인하는 절차

비밀번호 암호화

  1. 유저 아이디와 비빌번호 생성 ( 회원가입 )
  2. 유저 비밀전호 암호화해서 DB에 저장
  3. 유저 로그인
  4. 유저가 입력한 비밀번호 암호화 한후 암호화되서 DB에 저장된 유저 비밀번호 비교
  5. 일치하면 로그인
  6. 로그인 성공시 access token 을 클라이언트에게 전송
  7. 유저는 로그인 성공후 다음부터는 access token 을 첨부해서 requect를 서버에 전송
    즉, 매번 로그인을 안해도 된다.

bcrypt

bcrypt는 비밀번호 암호화에 사용되는 알고리즘을 제공하는 라이브러리

pip install bcrypt

비밀번호 암호화

프론트에서 비밀번호 값을 받았다면, bcrypt의 hashpw() 메소드로 비밀번호 암호화를 진행한다.

1. import bcrypt

import bcrypt

2. encode(utf-8)

password = data['password'].encode('utf-8')

bcrypt 인자는 bytes로 입력을 받기때문에 비밀번호를 먼저 byte형으로 바꿔주자

3. hashpw()

password_crypt = bcrypt.hashpw(password,bcrypt.gensalt())

3-1. gensalt()

.gensalt() 매소드로 소금을 생성했다.

4. DB에 저장하기

password_crypt = password_crypt.decode('utf-8')

데이터베이서의 유저정볼르 담는 테이블을 확인해보면 Fieldtype은 VARCHAR(200)과 같이 문자열을 받도록 되어 있다. 해쉬 비밀번호는 Bytes형 이기 때문에 DB에 저장 할 수 없다. 저장할 수 있도록 문자열로 decoing 해주어야 된다

로그인 적용하기

로그인이 구현되는 과정을 알아보자

  1. POST 요청으로 아이디와 비밀번호를 받는다.
  2. 아이디정보를 DB에 존재하는지 찾는다.
  3. 비밀번호를 암호화(회원가입 시 비번암호화 로직과 동일) 한다.
  4. DB의 비밀번호 값과 새로입력받은 해시비밀번호와 값이 같은지 확인한다.

1. checkpw()

account = Accounts.objects.get(email = data['email'])
if bcrypt.checkpw(data['password'].encode('utf-8'),account.password.encode('utf-8')):

bcrpt에서는 비밀번호 정보를 비교 할 수 있는 checkpw() 메소드를 제공한다.
❗️ 비교할때는 입력받은 데이터도 encoding상태로 비교를 해줘야된다!

2. token

token = jwt.encode({'id':account.id},SECRET_KEY,algorithm=ABC)
token = token.decode('utf-8')
	return JsonResponse({'message':'로그인 성공!', 'token' :f'{token})

로그인 성공시 토큰 부여

0개의 댓글