๐ง Spring Framework์ ๊ด๊ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์, JWT ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ณ๊ฐ์ ๊ฒ์ผ๋ก ์๋ก ์ฐ๊ด๋์ด ์์ง ์์ ์ฌ์ค์ Spring Framework์ ๊ด๊ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ถ๊ฐ๋์ด ์์ง ์์๋ JWT ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
๐ ํด์ผํ ์ผ
JwtTokenizer ํด๋์ค๋ JWT(Json Web Token)์ ์์ฑํ๊ณ ๊ฒ์ฆํ๋ ์ผ์ ํ๋ค๋ ๊ฒ์ ์์ง๋ง์ข์์ใ ใ ใ !
์กฐ๊ฐ์กฐ๊ฐ ๋ฐ๋ค๋ค-๐
๐กSecret Key๋ฅผ ์ํธํ ํ๋ ๋ฉ์๋
getBytes(StandardCharsets.UTF_8)
๋ก byte[]ํ ํ๋ค. ๐ก์ธ์ฆ๋ ์ฌ์ฉ์์๊ฒ ์ต์ด๋ก JWT๋ฅผ ๋ฐ๊ธํด์ฃผ๋ JWT ์์ฑ ๋ฉ์๋
ํ๋ผ๋ฏธํฐ๋ก Payload(claims, subject, expiration, SecretKey)๋ฅผ ๋ฐ๋๋ค.
getKeyFromBase64EncodedKey() : ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ Base64 ํ์์ Secret Key๋ฅผ ์ด์ฉํด Key(Security Key) ๊ฐ์ฒด๋ฅผ ์ป๋๋ค.
setClaims() : JWT์ ํฌํจ ์ํฌ Custom Claims๋ฅผ ์ถ๊ฐํ๋ค.
- Custom Claims์๋ ์ฃผ๋ก ์ธ์ฆ๋ ์ฌ์ฉ์์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ค.
๊ทธ ์ธ์ ํด๋ ์ ์ถ๊ฐ๋ JWT ๊ธฐ๋ณธ ๊ฐ๋
- payload ์ฐธ๊ณ ํ ๊ฒ
signWith() : JWT์ ์๋ช ์ ์ ์ฅํ๋ ๋ฉ์๋๋ก Secret Key๋ก ์ป์ Key ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ๋๋ค.
compact() : JWT๋ฅผ ์์ฑํ๊ณ ์ง๋ ฌํํ๋ ๋ฉ์๋
๐กAccessToken์ด ๋ง๋ฃ๋์์ ๊ฒฝ์ฐ, ์ฌ๋ฐ๊ธ์ ๋ด๋นํ๋ RefreshToken์ ์์ฑํ๋ ๋ฉ์๋
ํ๋ผ๋ฏธํฐ๋ก Payload(subject, expiration, SecretKey)๋ฅผ ๋ฐ๋๋ค.
๐ง ์ claims์ ์์ง?
RefreshToken์ ์ญํ ์ ๋จ์ํ๊ฒ AccessToken ์ฌ๋ฐ๊ธ! ์ฌ์ฉ์์ ๊ด๋ จ๋ ์ ๋ณด๋ AccessToken์ด ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ์ด์ค์ผ๋ก ๋ด์ ํ์๊ฐ ์๋ค!
1-2. generateAccessToken()์ ์ค๋ณต๋๋ ๋ด์ฉ์ด๋ฏ๋ก ์๋ต!
๐กJWT์ ์๋ช
์ ์ฌ์ฉํ Secret Key๋ฅผ ์์ฑํ๋ ๋ฉ์๋
ํ๋ผ๋ฏธํฐ๋ก encodeBase64SecretKey()
๋ฉ์๋๋ก Base64 ํ์์ผ๋ก ์ธ์ฝ๋ฉ ๋ Secret Key๋ฅผ ๋ฐ๋๋ค.
๐ ํด์ผํ ์ผ
๐กJUnit ํ ์คํธ์์ ํ ์คํธ ์ธ์คํด์ค์ ์์ฑ ๋จ์๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ ๋ํ ์ด์
๊ธฐ๋ณธ๊ฐ์ Lifecycle.PER_METHOD๋ก ํด๋น ์ ๋ํ
์ด์
์ด ๋ช
์๋์ด ์์ง ์์๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ์ฉ๋๋ค.
PER_METHOD : ํ
์คํ
๋ฉ์๋ ๋ณ๋ก ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค.
PER_CLASS : ํ
์คํ
ํด๋์ค ๋ณ๋ก ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ค.
๐ง ๋ฌด์จ ์ฐจ์ด์ง?
PER_METHOD๋ ๊ฐ๊ฐ์ ํ ์คํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ด์ผ ํ ๊ฒฝ์ฐ ์ฌ์ฉ๋๊ณ , ํ ์คํธ๋ฅผ ์์๋๋ก ์ํ ๊ฐ์ ๊ณต์ ํ๋ฉฐ ๋ค์ ํ ์คํธ๋ฅผ ์งํํด์ผ ํ๋ ์ํฉ์์๋ PER_CLASS๋ฅผ ์ฌ์ฉํ๋ค.
ํ ์คํธ์ ์ฌ์ฉํ Secret Key๋ฅผ Base64 ํ์์ผ๋ก ์ธ์ฝ๋ฉํ ํ, ์ธ์ฝ๋ฉ ๋ Secret Key๋ฅผ ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฌ์ฉํ๋๋ก ํ๋ค.
๐กPlain Text์ธ Secret Key๊ฐ Base64 ํ์์ผ๋ก ์ธ์ฝ๋ฉ์ด ์ ์์ ์ผ๋ก ์ํ๋๋์ง ํ ์คํธ
Plain Text์ Secret Key์ ์ธ์ฝ๋ฉ ๋ Secret Key๋ฅผ ๋์ฝ๋ฉํ ๊ฐ์ ๋น๊ต ๊ฒ์ฆํ๋ค.
๐ก JwtTokenizer๊ฐ Access Token์ ์ ์์ ์ผ๋ก ์์ฑํ๋์ง ํ ์คํธ
JWT๋ ์์ฑํ ๋๋ง๋ค ๊ฐ์ด ๋ฐ๋๊ธฐ ๋๋ฌธ์ ์์ฑ๋ AccessToken์ด null์ธ์ง ์๋์ง๋ง ๊ฒ์ฆํ๋ค.
๊ทธ ์ธ์ ๋ ์ ํํ ํ
์คํธ๋ JWT์ ์๋ช
๊ฒ์ฆ์์ ํ์ธํ ์ ์๋ค.
๐ก JwtTokenizer๊ฐ Refresh Token์ ์ ์์ ์ผ๋ก ์์ฑํ๋์ง ํ ์คํธ
generateAccessTokenTest()์ ๋์ผํ์ฌ ๋ด์ฉ ์๋ต
๐ ์ฌ๊ธฐ๊น์ง ๋ชจ๋ ํ ์คํธ ์ผ์ด์ค์ ํต๊ณผ ๋๋ค๋ฉด JWT๋ฅผ ๊ฒ์ฆํ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค