What you will learn?
- ์ธ์ฆ๊ณผ ์ธ๊ฐ์ ์ ์.
- ์ํธํ ๊ด๋ จ ๊ธฐ์ ๋ฐ ์ด๋ก .
- ๋จ๋ฐฉํฅ ํด์ฌ์ฒ๋ฆฌ๋ฅผ ์ํด bcrypt library ์ฌ์ฉํ๊ธฐ.
- ์ํธํ/๋ณตํธํ ๋์์ ์ํด JWT(Json Web Token) ์ฌ์ฉํ๊ธฐ.
1. ์ธ์ฆ๊ณผ ์ธ๊ฐ์ ์ ์.
- ์ธ์ฆ(Authentication):
์ ์ ์ identification๋ฅผ ํ์ธํ๋ ๊ณผ์ .
account, password ์ ๋ณด๋ฅผ ๋ณด๋ด๋ฉด ์ด๋ฅผ ์๋ฒ์์ ์ฒดํฌํ๋ ์ ์ฐจ๋ฅผ ํ๋๋ฐ ํ๋ฌธ์ ์ด์ฉํ๋ฉด ๋ณด์ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ๋ฏ๋ก ์ํธํ ๊ณผ์ ์ด ํ์ํ๋ค.
- ์ธ๊ฐ(Authorization):
request ์์ ์ ์ธ์ฆ๋ ์ ์ ์ ์์ฒญ์ธ์ง๋ฅผ ํ์ธํ๋ ์ ์ฐจ.
๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋ฌผ๋ก Netflix ๊ฐ์ ์๋น์ค๋ ์ด์ฉ๊ฐ๋ฅ ๊ธฐ๊ฐ ๋ฑ์ ์ ๋ณด๋ ์์ ๊ฒ์ด๋ค.
2. ์ํธํ ๊ด๋ จ ๊ธฐ์ ๋ฐ ์ด๋ก .
- ๋จ๋ฐฉํฅ ํด์ฌํจ์
์ค์ํ ์ ๋ณด(password ๋๋ ๊ฐ์ธ์ ์ฉ์ ๋ณด)์ ๊ฒฝ์ฐ ๋ณด์์ ์ํด ๋ณตํธํ๊ฐ ๋ถ๊ฐ๋ฅํ ์ํธํ algorithm์ ์ฌ์ฉํ๋ค. HS256์ด ๋ํ์ ์ด๋ฉฐ ์ด๋ฐ algorithm์ '๋จ๋ฐฉํฅ ํด์ฌํจ์ ์ฒ๋ฆฌ'๋ผ ๋ถ๋ฅธ๋ค.
๋จ๋ฐฉํฅ ํด์ฌํจ์๋ ๋ค์ ์ทจ์ฝ์ ์ ๊ฐ๋๋ค.
- Rainbow table attack: ๋ฏธ๋ฆฌ ํด์ฌ๊ฐ๋ค์ ๊ณ์ฐํด ๋์ ํ
์ด๋ธ.
ํด์ฌํจ์๋ ์๋ ๋น ๋ฅธ ๋ฐ์ดํฐ ๊ฒ์๊ธฐ๋ฅ์ ์ํด ์ค๊ณ๋ ๊ฒ์ผ๋ก ์ด๋ฅผ ์ด์ฉ, ๊ณต๊ฒฉ์๋ ๋งค์ฐ ๋น ๋ฅธ ์๋๋ก ์์์ ๋ฌธ์์ด์ ๋ค์ด์ ์คํธ์ ๋์ ๋ค์ด์ ์คํธ๋ฅผ ๋น๊ตํ ์ ์๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก password๋ฅผ ์ถ์ธกํ๋ฉด ๊ธด์๊ฐ์ ๋ค์ด์ง ์๊ณ ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ํธํํ๋ ์ธก์์ salt, Key Stretching ๋ฑ์ ๊ธฐ์ ์ ์ถ๊ฐ๋ก ์ ์ฉํ๋ค.
- Salt, Key Stretching
- Salt : ์ค์ ๋น๋ฐ๋ฒํธ ์ธ์ ๋๋ค ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์ฌ Hash ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ.
- Key Stretching : Salt ํฌํจํ Hash๋ฅผ ๋ค์ Hash ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ.
- ๋ณตํธํ ๊ฐ๋ฅํ ์ํธํ
๋ณด์์ ์ผ๋ก ์ค์ํ์ง ์์ ์ ๋ณด(๋ณด์์ ํ์ทจ๋๋ ํฐ ์๋ฏธ๊ฐ ์๋ ๋ฐ์ดํฐ)๋ ์ํธํ/๋ณตํธํ์ ์ฌ์ฉํ๋ secret key๋ง ๋น๊ณต๊ฐ๋ก ์ฒ๋ฆฌ, requester๊ฐ ์ํธํ๋ ์ ๋ณด๋ฅผ ๋ณด๋ด๋ฉด responser๋ secret key ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฅผ ๋ณตํธํํ์ฌ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๋ค.
Token์ด ๋ํ์ ์ธ ์๋ก login์ ํตํด ์ธ์ฆ๋ ์ฌ์ฉ์์๊ฒ Service๋ ์ํธํ๋ token์ ๋ฐ๊ธํ๋ฉด ์ฌ์ฉ์ ์ธก web client์ local storage๋ session ์ ์ ์ฅ, ์ด ํ ์ฌ์ฉ์ request์ token์ ํฌํจํ๋ฉด Service๋ token์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์์ ์ธ๊ฐ์ ๋ณด๋ฅผ ํ์ธํ์ฌ Service ์ฌ๊ณต์ฌ๋ถ๋ฅผ ์ ์ดํ๋ค.
3. ๋จ๋ฐฉํฅ ํด์ฌ์ฒ๋ฆฌ๋ฅผ ์ํด bcrypt library ์ฌ์ฉํ๊ธฐ
- 'bcrypt' ํจํค์ง๋ฅผ pip๋ก ์ค์น.
pip install bcrypt
- bcrypt ๋ก Hash ์ฒ๋ฆฌ
import bcrypt
password = "1234"
salt = bcrypt.getsalt()
print(salt)
hashed_pw = bcrypt.hashpw(password.encode(), salt)
print(hashed_pw)
if bcrypt.checkpw(password.encode(), hashed_pw):
return 'allowed password'
else:
return 'non-allowed password'
- hashpw() ํธ์ถ์ password๋ 'bytes' ํ์์ผ๋ก ์
๋ ฅ๋์ผ ํ๋ค. ์์์ string ์ด๋ฏ๋ก encode() ๋ฅผ ํตํด bytes๋ก ๋ณ๊ฒฝ.
- salt๊ฐ์ bcrypt.gensalt()๋ฅผ ํตํด ์์ฑ ํ ์ ์๋ค. ์ด๋ฅผ ํตํด hashed๋ pw ๋ฅผ ์ป๋๋ค.
- checkpw() ๋ฅผ ํตํด hashed๋ ์ํธ์ ํ๋ฌธ์ ๋น๊ต, ๋งค์นญ๋๋์ง๋ฅผ ํ์ธ ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ํธํ์ ์ฌ์ฉ๋ salt ๋ฐ์์ฌ๋ถ๋ฅผ ์ด๋ป๊ฒ ์ ์ ์์๊น?
- ์์์ salt์ hashed_pw ์ถ๋ ฅ๊ฐ์ ๋น๊ตํด๋ณด๋ฉด salt๊ฐ์ด hashed_pw์ '.'๋ฅผ ๊ธฐ์ค์ผ๋ก ํฌํจ๋์ด ์๋๊ฒ์ ์ ํ์ธ ํ ์ ์๋ค. ์ฆ ์ํธํ๋ ๋ฐ์ดํฐ์์ salt๊ฐ ์กด์ฌํ๋ฏ๋ก checkpw ๊ณผ์ ์ ๋น๊ตํ ํ๋ฌธ๋ง ์์ผ๋ฉด ์ถฉ๋ถํ๋ค.
4. ์ํธํ/๋ณตํธํ ๋์์ ์ํด JWT(Json Web Token) ์ฌ์ฉํ๊ธฐ.
1. 'pyjwt' ํจํค์ง๋ฅผ pip๋ก ์ค์น
pip install pyjwt
- jwt๋ก Token ๋ง๋ค๊ธฐ
import jwt
token = jwt.encode({'user_id':5}, SECRET_KEY, algorithm='HS256')
decodeFromToken = jwt.decode(token, SECRET_KEY, algorithm='HS256')
- JWT ๋ก encode/decode ์ secretํค์ algorithm์ ์ง์ ํด์ผ ํ๋ค.
- secret ํค์ ๊ฒฝ์ฐ ์ธ๋ถ๋ก ๊ณต๊ฐ๋๋ฉด ์ ๋๋ค. ํนํ github๋ก ๋ฒ์ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ ํด๋น secret์ git ๊ด๋ฆฌ ๋์์์ ์ ์ธํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค.