๐Ÿƒ๐Ÿผ์ธ์ฆ&์ธ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ 2

may_soouuยท2020๋…„ 9์›” 8์ผ
0

๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”(ํ•ด์‰ฌํ•จ์ˆ˜) ๋ฐ ๋กœ๊ทธ์ธ ์‹œ ์•”ํ˜ธํ™”๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ์‹ค์ œ ์ฝ”๋“œ๋กœ ์‹ค์Šตํ•ด๋ณด์ž!!

1. ์ธ์ฆ(ํšŒ์›๊ฐ€์ž…)

ํฐ ํ๋ฆ„ : ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ›์•„์„œ > ์ธ์ฝ”๋”ฉ > ํ•ด์‰ฌํ•จ์ˆ˜ > ๋””์ฝ”๋”ฉ

1) ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด(ํšŒ์›๊ฐ€์ž… ์‹œ ํ”„๋ก ํŠธ์—์„œ ๋ฐ”๋””์— ๋‹ด์•„์„œ ๋ณด๋ƒ„)

password = '1234'
 #type์€ 'string'์ด๋‹ค

2) ์„œ๋ฒ„์—์„œ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•œ ํ›„, ์ธ์ฝ”๋”ฉ์„ ํ•œ๋‹ค.

encoded_password = password.encode('utf-8')
 # ์ธ์ฝ”๋”ฉ์„ ํ•˜๋ฉด type์€ 'bytes'๊ฐ€ ๋œ๋‹ค

3) ์ธ์ฝ”๋”ฉ์„ ํ•˜๋Š” ์ด์œ ๋Š”?
ํ•ด์‰ฌํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์„œ ์•”ํ˜ธํ™”๋ฅผ ์‹œํ‚ฌ ๊ฑด๋ฐ ํ•ด์‰ฌํ•จ์ˆ˜๋Š” ์ธ์ž๋ฅผ ๋ฐ”์ดํŠธ๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•ด์‰ฌํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ๋ณด์ž

hashed_password = bcrypt.hashpw(encoded=password, bcrypt.gensalt())
 # type์€ 'bytes'์ด๋‹ค.

4) ๋‹ค์‹œ ๋””์ฝ”๋”ฉํ•˜๊ธฐ! ์ด์œ ๋Š”?
ํ•ด์‰ฌํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ b'$2$4daewdsfs' ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ”๋€Œ๋Š”๋ฐ,
์•ž์— ์žˆ๋Š” b๋„ ํ•˜๋‚˜์˜ str์œผ๋กœ ์ธ์‹ํ•œ๋‹ค.
์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋”ฐ์˜ดํ‘œ ์•ˆ์— ์žˆ๋Š” ๋ฌธ์ž๋งŒ์ด๊ธฐ ๋•Œ๋ฌธ์— b๊ฐ€ ๊ฐ™์ด DB์— ์ €์žฅ๋˜๋ฉด ์•ˆ๋จ!!

db_password = hashed_password.decode('utf-8')

2.์ธ๊ฐ€(๋กœ๊ทธ์ธ)

1) ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋น„๊ตํ•  ๋•Œ๋Š”

print(bcrypt.checkpw('1234'.encode('utf-8'), 
 #์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ธ์ฝ”๋”ฉํ•ด์„œ ๋ฐ”์ดํŠธ ํƒ€์ž… ์ƒํƒœ๋กœ
db_password.encode('utf-8'))
 #๋””๋น„์— ์ €์žฅ๋œ ํ•ด์‰ฌ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋‹ค์‹œ ์ธ์ฝ”๋”ฉํ•ด์„œ ๋ฐ”์ดํŠธ ํƒ€์ž… ์ƒํƒœ๋กœ ๋น„๊ต

checkpw ํ•จ์ˆ˜ ์•ˆ์— ์ธ์ž๋Š” ํƒ€์ž…๊ฐ’์„ ๋ฐ”์ดํŠธ๋กœ ๋ฐ›๋Š”๋‹ค!!
๊ทธ๋ž˜์„œ 1)์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ / 2)DB์— ์ €์žฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ชจ๋‘ ๋ฐ”์ดํŠธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜

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

b = '5678'
bcrypt.checkpw(d.encode('utf-8'), hashed_password) 
 # return False 

2) ๋กœ๊ทธ์ธ ํ–ˆ์œผ๋ฉด ํ”„๋ก ํŠธ๋กœ ํ† ํฐ์„ ๋„˜๊ฒจ์ค˜์•ผํ•œ๋‹ค.
ํ† ํฐ์„ ๋„˜๊ธธ ๋•Œ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ด์œผ๋ฉด ์•ˆ๋˜๋ฉฐ, pk๊ฐ’๊ณผ ๊ฐ™์€ ์šฐ๋ฆฌ๋งŒ ์•„๋Š” ๋‚ด๋‹ด์•„์„œ ์ „๋‹ฌํ•œ๋‹ค.

user = User.object.get(email='soo@aa.aa)
payload = {'user_id':user.id}
encoded_jwt = jwt.encode(payload, 'secret_key', algorithm='')

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ ! ์‹œํฌ๋ฆฟ ํ‚ค์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ง์ ‘ ๊ธฐ์žฌํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
๋‹ค๋ฅธ ํŒŒ์ผ์— ์‹œํฌ๋ฆฟ ํ‚ค์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋”ฐ๋กœ ๊ธฐ์žฌํ•œ ํ›„์—, import๋กœ ๊ฐ€์ ธ์˜จ๋‹ค
์•„๋ž˜์™€ ๊ฐ™์ด ์‹œํฌ๋ฆฟํ‚ค, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•ด๋‹น ์ž๋ฆฌ์— ๋ณ€์ˆ˜๋ช…์„ ์ž…๋ ฅํ•ด์ค€๋‹ค
์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์€ 256์ด๋‹ค

์˜ˆ๋ฅผ ๋“ค์–ด,

# conpig.py ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋กœ ์ง€์ •
SECRET_KEY = 'apple'
ALGORITHM = 'HS256'

# views.py ํŒŒ์ผ์—์„œ ์ž„ํฌํŠธ
from config import SECRET_KEY, ALGORITHM
encoded_jwt = jwt.encode(payload, SECRET_KEY, ALGORITHM)

print("*JWT:", encdoed_jwt.decode('utf-8'))

ํ”„๋ก ํŠธ๋Š” ํ† ํฐ์„ ์ŠคํŠธ๋ง์œผ๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, ํ† ํฐ์„ ๊ทธ๋Œ€๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ์•ˆ๋˜๊ณ , ๋‹ค์‹œ ๋””์ฝ”๋”ฉ์„ ํ•ด์„œ์ค˜์•ผํ•œ๋‹ค.

์žฅ๊ณ  ์ฝ”๋“œ๋กœ ๋ณต์Šตํ•ด๋ณด์ž

1. ํšŒ์›๊ฐ€์ž…

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

๐Ÿ” ์ฝ”๋“œ ํ•œ์ค„์”ฉ ๋‹ค์‹œ๋ณด์ž

1) data['password'].encode('utf-8')
  # ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ธ์ฝ”๋”ฉ ํ•˜๊ธฐ > ํ•ด์‰ฌํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ๊ธฐ ์œ„ํ•ด
  # type : bytes

2) bcrypt.hashpw(data['password'].encode('utf-8')
   ,bcrypt.gensalt()
  # ํ•ด์‰ฌ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ๊ธฐ
  # type : string

3) bcrypt.hashpw(data['password'].encode('utf-8')
   ,bcrypt.gensalt().decode('utf-8')
  # ๋‹ค์‹œ ๋””์ฝ”๋”ฉ ํ•˜๊ธฐ > ์•”ํ˜ธํ™” ๋œ ๋ฌธ์ž์˜ b๋ฅผ ๋นผ์ฃผ๊ธฐ ์œ„ํ•ด!
  # type : string

2. ๋กœ๊ทธ์ธ

login_user = User.objects.get(email=data['email'])

if bcrypt.checkpw(password.encode('utf-8'), login_user.password.encode('utf-8')):
   token = jwt.encode(
      {
        'user_id' : login_user.id,
       }, SECRET_KEY, algorithm = ALGORITHM).decode('utf-8')

    return JsonResponse({'Authorization': token}, status=200)

๐Ÿ” ์ฝ”๋“œ ํ•œ์ค„์”ฉ ๋‹ค์‹œ๋ณด์ž

password = data.get('password', None)

login_user = User.objects.get(email=data['email'])
 # ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ์„ DB์—์„œ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์•„์„œ ๋ณ€์ˆ˜์— ์ €์žฅ

password.encode('utf-8')
 # ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ธ์ฝ”๋”ฉ > checkํ•จ์ˆ˜๋Š” ์ธ์ž๋ฅผ ๋ฐ”์ดํŠธ๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—!

login_user.password.encode('utf-8')
 # DB์ €์žฅ๋˜์–ด ์žˆ๋Š” ์•”ํ˜ธํ™”๋œ ํŒจ์Šค์›Œ๋“œ๋ฅผ ๊บผ๋‚ด์™€์„œ ์ธ์ฝ”๋”ฉ > checkํ•จ์ˆ˜๋Š” ์ธ์ž๋ฅผ ๋ฐ”์ดํŠธ๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—!
 

bcrypt ์ถ”๊ฐ€ ์ •๋ฆฌ

  • ๋‹จ๋ฐฉํ–ฅ ํ•ด์‰ฌ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ๋‹จ๋ฐฉํ–ฅ ํ•ด์‰ฌ ํ•จ์ˆ˜๋ž€, ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‹ค์ด์ œ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค(๋‹ค์ด์ œ์ŠคํŠธ : ์•”ํ˜ธํ˜ธ๋œ ๋ฉ”์„ธ์ง€)
    - ๋‹จ๋ฐฉํ–ฅ์ธ ์ด์œ  : ์›๋ณธ ๋ฉ”์„ธ์ง€๋ฅผ ์•”ํ˜ธํ™”๋œ ๋ฉ”์„ธ์ง€์™€ ๋น„๊ตํ•˜๊ธฐ๋Š” ์‰ฝ์ง€๋งŒ, ์•”ํ˜ธํ™”๋œ ๋ฉ”์„ธ์ง€๋ฅผ ์—ญ์œผ๋กœ ์›๋ณธ ๋ฉ”์„ธ์ง€์™€ ๋น„๊ตํ•˜๊ธฐ๋Š” ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
profile
back-end ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€