ํด์ (Hash)
>>> encoded_password = password.encode('utf-8')
>>> encoded_password
b'1234'
>>> type(encoded_password)
<class 'bytes'>
>>> type(password)
<class 'str'>
- ์ธ์ฝ๋ฉํ strํ์
์ bytes ํ์
์ผ๋ก ๋ฐ๋๋ค.
>>> decoded_password = encoded_password.decode('utf-8')
>>> decoded_password
'1234'
>>> type(decoded_password)
<class 'str'>
- ๋์ฝ๋ฉ๋ bytes ํ์
์ ๋ค์ str ํ์
์ผ๋ก ๋ฐ๋๋ค.
>>> hashed_password = bcrypt, hashpw( password, bcrypt.gensalt() )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'hashpw' is not defined
- ์ธ์ฝ๋ฉ ๋์ง ์์ password๋ฅผ hashํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
>>> hashed_password = bcrypt.hashpw( password.encode('utf-8'), bcrypt.gensalt() )
>>> hashed_password
b'$2b$12$JNrMFFk4GJxBlPhRlBgO1.KqxX7wUQtQNRNIXnrqtrk7FVUX/2h5K'
- ์ธ์ฝ๋ฉํ password๋ฅผ hash๋ผ๋ฉด ํจ์ค์๋๊ฐ ์ ํด์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
>>> bcrypt.gensalt()
b'$2b$12$RIMTPk4mPJyb8so9ptXJlu'
>>> bcrypt.gensalt()
b'$2b$12$bzuGn3BE.kgH3nq5R6BJDO'
>>> bcrypt.gensalt()
b'$2b$12$1nwjw90b5ONVvUFWBuBTxu'
- salt๊ฐ์ ๋๋ค์ผ๋ก ์์ฑ๋๋ค.
- salt๊ฐ์ ๋๋ค์ผ๋ก ์์ฑ๋๋๋ฐ, ์ด๋ป๊ฒ hash๋ ํจ์ค์๋๋ค์ ๋น๊ตํ ์ ์์๊น?
- hash๋ ํจ์ค์๋์๋ salt ๊ฐ์ด ์ถ๊ฐ๋์ด ์๋ค.
>>> salt = bcrypt.gensalt()
>>> salt
b'$2b$12$KEi3lKW7D08IgUOUSpk/1O'
>>> hashed_password = bcrypt.hashpw( password.encode('utf-8'), salt
... )
>>> hashed_password
b'$2b$12$KEi3lKW7D08IgUOUSpk/1OyWyMgSzGTktOBaXTVFAq5o8Tvpc7zxm'
- salt๊ฐ์ ๋ฏธ๋ฆฌ ์ ์ฅํด๋๊ณ hashed_password์ salt๊ฐ์ ์ง์ ํด์ฃผ๋ฉด hashed_password ์์ ์ง์ ํ salt ๊ฐ์ด ํฌํจ๋์ด ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
>>> type(hashed_password)
<class 'bytes'>
- hash๋ ํจ์ค์๋๊ฐ์ bytes ํ์
์ด๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ hash๋ ํจ์ค์๋ ๊ฐ์ decodeํ์ฌ ๋ฌธ์์ด๋ก ๋ง๋ค๊ณ ์ด ๊ฐ์ ์ ์ฅํ๋ค.
JWT
>>> encoded_jwt = jwt.encode( {'user-id': 5}, 'secret', algorithm='HS256' )
- payload์๋ ์ ๋ ํจ์ค์๋๋ ์ด๋ฉ์ผ ๋ฑ ๊ฐ์ธ ์ ๋ณด๋ฅผ ๋ด์์๋ ์๋๋ค.
- ํ์ง๋ง user_id๋ ๋
ธ์ถ๋์ด๋ ๋จ์ํ ์ซ์์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ ๊ถํ์ด ์๋ ํ ์๋ฏธ์๋ ๋ฐ์ดํฐ์ด๋ค.
>>> encoded_jwt
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyLWlkIjo1fQ.tBQu0HfnOYK7lL3tH5ImgsI-y4Jz1RKscJWbV3U2QMI'
>>> encoded_jwt
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyLWlkIjo1fQ.tBQu0HfnOYK7lL3tH5ImgsI-y4Jz1RKscJWbV3U2QMI'
>>> type(encoded_jwt)
<class 'str'>
- token์ ํ์
์ ํ์ธํ๋ฉด str ํ์
์ธ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ์ฌ๊ธฐ์ ๋ค๋ฅธ ๋ถ๋ค์ bytes ํ์
์ด ๋์์ ์ ๋๋ str ํ์
์ผ๋ก ๋์ค๋ ํ์ธํด ๋ดค๋๋ PyJWT ๋ฒ์ v2.0.0 ์ด์์ด๋ผ๋ฉด jwt.encode์ ๋ฐํ๊ฐ์ด bytes ํ์
์ด ์๋๋ผ string ํ์
์ด๋ผ๊ณ ํ๋ค.
bcrypt
- bcrypt๋ str ๋ฐ์ดํฐ๊ฐ ์๋ Bytes ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ค.
- ๋ฐ๋ผ์ ์ํธํ์์ bytesํ ํด์ผ ํ๋ค.
- ํ์ด์ฌ์์๋ str์ encodeํ๋ฉด bytes(์ด์งํ)๊ฐ ๋๊ณ , bytes๋ฅผ decodeํ๋ฉด strํ ํ๋ค.
- encode, decode ์์ ์ฐ๋ฆฌ๊ฐ ์ธ์ํ ์ ์๋ ํํ๋ก ๋ณํํ๊ธฐ ์ํด 'UTF-8' ์ ๋์ฝ๋ ๋ฌธ์ ๊ท๊ฒฉ์ ์ฌ์ฉํ๋ค.
ํ์๊ฐ์
์ ๋น๋ฐ๋ฒํธ ์ํธํํด์ ์ ์ฅ
hashed_password = bcrypt.hashpw(
data['password'].encode('utf-8'),bcrypt.gensalt()
).decode()
User.objects.create(
name = data['name'],
email = data['email'],
password = hashed_password,
mobile = data['mobile'],
address = data['address'],
birth_date = data['birth_date']
)
password๋ฅผ DB์ ์ฒ์ ์
๋ ฅํ ๋ decode() ํด์ผ ํ๋ ์ด์ ๋?
bcrypt.hashpw('1234'.encode('utf-8'),bcrypt.gensalt()) ๋ b'$2b$12$8EPF0NBZotiz0aPDVKwQHumq6dMhMnfP1BwC3xh2lKigedKeH4ucq'
์ธ๋ฐ,
bcrypt.hashpw('1234'.encode('utf-8'),bcrypt.gensalt()).decode()๋
'$2b$12$8EPF0NBZotiz0aPDVKwQHumq6dMhMnfP1BwC3xh2lKigedKeH4ucq'
๋ก ์์ ๋ฐ์ดํธ๋ผ๋ ํ์๋ฅผ ๋นผ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค
- ์
๋ ฅํ password๋ str ํ์
์ด๊ธฐ ๋๋ฌธ์ encode๋ฅผ ์ด์ฉํด bytes ํ์
์ผ๋ก ๋ณํํ๋ค.
- ์ด ๋ bytes ํ์
์ผ๋ก ๋ณํํ password ์์๋ b๊ฐ ๋ถ๊ธฐ ๋๋ฌธ์ ๋ค์ decode๋ฅผ ํด์ฃผ์ด ๋งจ ์์ b๋ฅผ ์ญ์ ํด์ค๋ค.
๋ก๊ทธ์ธ ์ ๋น๋ฐ๋ฒํธ์ ์ผ์น์ฌ๋ถ ํ์ธ
>>> bcrypt.checkpw(new_password.encode('utf-8'), hashed_password)
True
- bcrypt.checkpw() ๋ฉ์๋๊ฐ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ๋ ์์
์ ํ๋ค.
- ๋ฉ์๋ ๊ท์น
- ์
๋ ฅ๋ฐ์ ํจ์ค์๋, ์ ์ฅ๋ ์ํธํ๋ ํจ์ค์๋
- ์
๋ ฅ๋ฐ์ ํจ์ค์๋์ ์ ์ฅ๋ ์ํธํ๋ ํจ์ค์๋๋ฅผ ๋น๊ตํ๋ค.
- ๋๋ค ๋ฐ์ดํฐ ํ์
์ bytes ์ฌ์ผ ํ๋ค.
user_info = User.objects.get(email=data['email'])
input_pw = data['password']
user_pw = user_info.password
if not bcrypt.checkpw(input_pw.encode('utf-8'), user_pw.encode('utf-8')):
return JsonResponse({'message':'INVALID_USER'}, status=401)
return JsonResponse({'message':'SUCCESS'}, status=200)
- input_pw์ user_pw ๋ ๋ค ํ์ฌ str ํ์
์ด๊ธฐ๋๋ฌธ์ encode๋ฅผ ํตํด bytes ํ์
์ผ๋ก ๋ณํํด ๋น๊ตํด์ค๋ค.
๋ก๊ทธ์ธ ์๋ฃ ํ ์์ธ์ค ํ ํฐ
๋ฐ์ฝ๋ ์ดํฐ
- ๋ฐ์ฝ๋ ์ดํฐ๋ ํน์ ํจ์์ ๋ฐ๋ก ์์ ๋ถ์ด์ ํน์ ํจ์ ์คํ ์ ๋จผ์ ์คํ ๋์ด ์ฌ์ ์ ํ๊ณ ์ถ์ ์์
์ ์ฒ๋ฆฌํ๋ ํจ์์ด๋ค.
- ์์ฑํ ๋ฐ์ฝ๋ ์ดํฐ
- ์ฌ์ฉ์๊ฐ ํน์ ๊ธฐ๋ฅ์ ์คํํ๊ธฐ ์ ์ ์ฌ์ฉ์๊ฐ ๊ทธ ๊ธฐ๋ฅ์ ์ํํ ๊ถํ์ด ์๋์ง ์ดํด๋ณด๋ ๋ฐ์ฝ๋ ์ดํฐ
- ํ ํฐ์ผ๋ก ๊ถํ์ด ํ์ธ๋์ง ์์ผ๋ฉด ํน์ ๊ธฐ๋ฅ์ ๊ฐ์ง ํจ์๋ ์คํ๋์ง ์์
๊ฒ์๋ฌผ ๋ฑ๋ก ๊ธฐ๋ฅ ๊ตฌํ
Posting app
- djando app ์์๋ ์ฃผ๋ก ๋ค๋ฃจ๋ ๋ฐ์ดํฐ์ ์ข
๋ฅ๊ฐ ๋ฌ๋ผ์ง๋ ์์ ์์ ์ฑ์ ๋ถ๋ฆฌํ๋ค.
- ๊ฒ์๋ฌผ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ์๋ ๊ทธ ์ฑ์ง์ด ๋ฌ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ
์ด๋ธ์ ๋ฐ๋ผ ๊ด๋ฆฌํ๋ค.
- ์ฃผ๋ก ๋ค๋ฃจ๋ ํ
์ด๋ธ์ด ๋ฌ๋ผ์ง๋ฉด ์ฑ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
Posting Model ์์ฑ
- ๊ฒ์๋ฌผ์ ๋ฑ๋กํ๊ธฐ ์ํด์๋ ์ฌ์ฉ์, ์์ฑ ์๊ฐ, ์ด๋ฏธ์ง url์ด ํ์ํ๋ค.
- ํด๋น ๊ฒ์๋ฌผ์ ์ ์ ๋ Foreign Key๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฏธ ์๋น์ค์ ๊ฐ์
๋ ์ฌ๋์ผ๋ก ์ฐ๊ฒฐํ๋ค.
<์ฐธ๊ณ >