๋ค์ ์ฃผ์ ํฐ ์ํ ๋ ๊ฐ๊ฐ ๊ฒน์น๊ณ ์ด๋์๊ฐ์ด ๊ธธ์ด์ง๋ค๋ณด๋ ๋ธ๋ก๊ทธ ๊ด๋ฆฌํ๋๋ฐ ์ ์ ์ด ์๋ค์๐ฅฒ ์ต๋ํ ๋ฐ๋ฆฌ์ง ์๊ณ ์ ๋ฆฌํด๋ณด๋ ค๋๋ก ํ๊ฒ ์ต๋๋ค!
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ์๋ฒ ํน์ DB์ ์ ์ ์ ๋ณด๋ฅผ ๋ด๋ ์ธ์ฆ ๋ฐฉ์์ผ๋ก, ๋งค ์์ฒญ๋ง๋ค ์๋ฒ์๋ง ๋ถ๋ด์ด ๊ฐ์ค๋๋ ์ธ์ฆ ๋ฐฉ์์ ๋๋ค. ์๋ฒ ๋ถ๋ด์ ์ค์ด๊ธฐ ์ํด ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ด ๋์ค๊ฒ ๋์๊ณ , ๊ทธ ์ค ๊ฐ์ฅ ๋ํ์ ์ธ ์ธ์ฆ ๋ฐฉ์์ JWT(JSON Web Token)์ ๋๋ค. ํด๋ผ์ด์ธํธ์ ์ํธํํ ์ ์ ์ ๋ณด๋ฅผ ๋ณด๊ดํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
JWT์ ์ข ๋ฅ
Access Token์ ๋ณดํธ๋ ์ ๋ณด๋ค(์ ์ ์ ์ด๋ฉ์ผ, ์ฐ๋ฝ์ฒ, ์ฌ์ง ๋ฑ)์ ์ ๊ทผํ ์ ์๋ ๊ถํ๋ถ์ฌ์ ์ฌ์ฉํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ ์ฒ์ ์ธ์ฆ์ ๋ฐ๊ฒ ๋ ๋(๋ก๊ทธ์ธ), access์ refresh token ๋๊ฐ์ง๋ฅผ ๋ค ๋ฐ์ง๋ง, access token์ ์ค์ ๋ก ๊ถํ์ ์ป๋๋ฐ ์ฌ์ฉํ๋ ํ ํฐ์ผ๋ก ๋น๊ต์ ์งง์ ์ ํจ๊ธฐ๊ฐ์ ์ฃผ์ด ํ์ทจ๋๋๋ผ๋ ์ค๋ซ๋์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. access token์ ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋๋ค๋ฉด refresh token์ ์ฌ์ฉํ์ฌ ์๋ก์ด access token์ ๋ฐ๊ธ๋ฐ์์ผ๋ก์ ์ ์ ๋ ๋ค์ ๋ก๊ทธ์ธํ ํ์๊ฐ ์์ต๋๋ค. ๋ฌผ๋ก refresh token ๋ง์ ํ์ทจ๋นํ ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ ์ ํธ์๋ณด๋ค ์ ๋ณด๋ฅผ ์งํค๋ ๊ฒ์ด ๋ ์ค์ํ ์น์ฌ์ดํธ๋ค์ refresh token์ ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
JWT ๊ตฌ์กฐ
Header
Header๋ ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํํ ์ด๋ค ์ข ๋ฅ์ ํ ํฐ์ธ์ง๊ฐ ์ ํ ์์ต๋๋ค.
{ "alg": "HS256", "typ": "JWT" }
Payload
์ ๊ทผ ๊ถํ, ์ ์ ์ด๋ฆ ๋ฑ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ํธํํ ๊ฒ์ ๋๋ค. ์ํธํ๊ฐ ๋๊ธด ํ์ง๋ง ๋๋๋ก ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ด์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
{ "sub": "someInformation", "name": "phillip", "iat": 171623391 }
Signature
์ํ๋ ๋น๋ฐํค๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํํฉ๋๋ค. ๋ง์ฝ HMAC SHA256 ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค๋ฉด ์๋์ ๊ฐ์ด signature๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
HMACSHA256(bawse64UrlEncode(header) + '.' + base64UrlEncode(payload), secret)
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์ ์ฐจ
ํด๋ผ์ด์ธํธ์์ ํ ํฐ์ด ์ ์ฅ๋๋ ์์น๋ local storage, cookie, react์ state ๋ฑ ๋ค์ํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ HTTP ํค๋(authorization ํค๋)์ ํ ํฐ์ ๋ด์๋ณด๋ผ ๋ bearer authentication์ ์ด์ฉํฉ๋๋ค.
ํ ํฐ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฅ์
Statelesness & Scalability (๋ฌด์ํ์ฑ & ํ์ฅ์ฑ)
์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ํ์๊ฐ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์๋ก์ด ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ํ ํฐ์ ํค๋์ ํฌํจ์ํค๋ฉด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์๋ฒ๋ฅผ ์ฌ๋ฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ์๋น์ค์ผ ์๋ก ํ ํฐ์ ์ฅ์ ์ด ๋ ๋ถ๊ฐ๋ฉ๋๋ค.
Safety (์์ ์ฑ)
์ํธํํ ํ ํฐ์ ์ฌ์ฉํ๊ณ , ์ํธํ ํค๋ฅผ ๋ ธ์ถํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ ์ธ์ฆ์ ์ ์ฅํด๋ ์์ ํฉ๋๋ค.
Convenience (ํธ๋ฆฌ์ฑ)
์ด๋์๋ ํ ํฐ์ ์์ฑํ ์ ์์ต๋๋ค. ํ ํฐ ์์ฑ์ฉ ์๋ฒ๋ฅผ ๋ง๋ค๊ฑฐ๋, ๋ค๋ฅธ ํ์ฌ์์ ํ ํฐ ๊ด๋ จ ์์ ์ ๋งก๊ธฐ๋ ๋ค์ํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๋ํ payload๋ฅผ ํตํด ์ด๋ค ์ ๋ณด์ ์ ๊ทผ ๊ฐ๋ฅํ์ง ๊ถํ์ ๊ฐํธํ๊ฒ ์ ํ ์ ์์ต๋๋ค.
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TIL 59: [์ปดํจํฐ ๊ณตํ] ๊ธฐ์ด (0) | 2021.10.26 |
---|---|
TIL 58: [์ธ์ฆ/๋ณด์] ๊ธฐ์ด - OAuth 2.0 (0) | 2021.10.25 |
TIL 56 - 2: [์ธ์ฆ/๋ณด์] ๊ธฐ์ด (0) | 2021.10.22 |
TIL 56 - 1: [์ธ์ฆ/๋ณด์] ๊ธฐ์ด (0) | 2021.10.21 |
TIL 55: [๋ฐ์ดํฐ๋ฒ ์ด์ค] NoSQL (2) | 2021.10.19 |