๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ(ํด์ฌํจ์) ๋ฐ ๋ก๊ทธ์ธ ์ ์ํธํ๋ฅผ ๋น๊ตํ์ฌ ์ผ์นํ๋์ง ํ์ธํ๋ ๊ฒ์ ์ค์ ์ฝ๋๋ก ์ค์ตํด๋ณด์!!
๋น๋ฐ๋ฒํธ ๋ฐ์์ > ์ธ์ฝ๋ฉ > ํด์ฌํจ์ > ๋์ฝ๋ฉ
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')
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'))
ํ๋ก ํธ๋ ํ ํฐ์ ์คํธ๋ง์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์, ํ ํฐ์ ๊ทธ๋๋ก ๋๊ฒจ์ฃผ๋ฉด ์๋๊ณ , ๋ค์ ๋์ฝ๋ฉ์ ํด์์ค์ผํ๋ค.
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
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ํจ์๋ ์ธ์๋ฅผ ๋ฐ์ดํธ๋ฅผ ๋ฐ๊ธฐ ๋๋ฌธ์!
- ๋จ๋ฐฉํฅ์ธ ์ด์ : ์๋ณธ ๋ฉ์ธ์ง๋ฅผ ์ํธํ๋ ๋ฉ์ธ์ง์ ๋น๊ตํ๊ธฐ๋ ์ฝ์ง๋ง, ์ํธํ๋ ๋ฉ์ธ์ง๋ฅผ ์ญ์ผ๋ก ์๋ณธ ๋ฉ์ธ์ง์ ๋น๊ตํ๊ธฐ๋ ์ด๋ ต๊ธฐ ๋๋ฌธ์ด๋ค.