์ธ์ฆ(Authentication)
- ์ฌ์ฉ์์ ์ ์์ ํ์ธํ๋ ๊ณผ์
- ์์) ๋ก๊ทธ์ธ ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ฑฐ๋, ์์ฒด์ธ์(์ง๋ฌธ, ์ผ๊ตด ์ธ์)์ ์ฌ์ฉํ๋ ๊ฒ
"๋๊ตฌ์ธ๊ฐ?"๋ฅผ ํ์ธ
์ธ๊ฐ (Authorization)
- ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์ด๋ค ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ ๋๋ค.
- ์ฆ, ์ฌ์ฉ์๊ฐ ํน์ ์์ ์ด๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋์ง๋ฅผ ๊ฒฐ์
- ์์) ์ํ ์ฑ์์ ๊ณ์ข ์กฐํ๋ ๊ฐ๋ฅํ์ง๋ง, ๋ค๋ฅธ ์ฌ๋์ ๊ณ์ข๋ ๋ณผ ์ ์๋ ๊ฒฝ์ฐ
"๋ฌด์์ ํ ์ ์๋๊ฐ?"๋ฅผ ๊ฒฐ์
์ธ์ฆ(Authentication)๋ฐ์ธ๊ฐ(Authorization)์ ํ์ํ ์ ๋ณด๋ค์ ์ํธํ ์ํจJSONํ ํฐ์ ์๋ฏธํ๋ค.

{
"typ": "JWT",
"alg": "HS256"
}
typ : ํ ํฐ ์ ํalg : ์๋ช
์ํธํ ์๊ณ ๋ฆฌ์ฆ(HMAC-SHA256,RSA)ํด๋ ์(claims)์ ํฌํจํ๋ค. ํด๋ ์(claims)์ key-value ํ์์ผ๋ก ์ด๋ฃจ์ด์ง ํ ์์ ์ ๋ณด
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
ํ์ด๋ก๋๋ ์ ํด์ง ๋ฐ์ดํฐ ํ์
์ด ์๋ค. ๋ํ์ ์ผ๋ก ๋ฑ๋ก๋ ํด๋ ์, ๊ณต๊ฐ ํด๋ ์, ๋น๊ณต๊ฐ ํด๋ ์ ์ด ์กด์ฌํ๋ค.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Signature ์์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ ํค๋์ ์ ์ํ ์๊ณ ๋ฆฌ์ฆ(alg)๋ฅผ ํ์ฉSignature์ ๊ตฌ์กฐ๋ (Header + payload) ์ ์๋ฒ๊ฐ ๊ฐ๊ณ ์๋ ์ ์ผํ ket(์ํฌ๋ฆฟ ํค)๊ฐ์ ํฉ์น ๊ฒ์ Header์์ ์ ์ํ alg ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํ ํ๋ค.Signature = Base64Url(Header) +.+ Base64Url(Payload) + ์๋ฒ์ ์ ์ผํ ํค(Secret Key)
๐ค
Header์payload๋ ์ 3์๊ฐ ๋ณตํธํ ๋ฐ ์กฐ์ ๊ฐ๋ฅ์ฑ ์์ง๋งSecret key๋ฅผ ๋ชจ๋ฅด๋ฉด ๋ณตํธํ ๋ฐ ์กฐ์์ด ๋ถ๊ฐ๋ฅํ๋ค. - > ๋ฐ๋ผ์Signature๋ ํ ํฐ์ ์๋ณ์กฐ ์ฌ๋ถ๋ฅผ ํ์ธํ๋๋ฐ ์ฌ์ฉ
Access Token: ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ณ ์๋ ์ค์ ๋ก ์ ์ ์ ์ ๋ณด๊ฐ ๋ด๊ธด ํ ํฐ์ผ๋ก, ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ด ์ค๋ฉด ์๋ฒ์์ ํด๋น ํ ํฐ์ ์๋ ์ ๋ณด๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด์ ๋ง๊ฒ ์๋ต์ ์งํRefresh Token: ์๋ก์ดAccess Token์ ๋ฐ๊ธํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ ํฐ์ผ๋ก ์งง์ ์๋ช ์ ๊ฐ์ง๋ Access Token์๊ฒ ์๋ก์ด ํ ํฐ์ ๋ฐ๊ธํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ,Access Token๋ณด๋ค ๊ธด ์๋ช ์ ๊ฐ์ง๋๋ก ํ๋ ๊ฒ์ด ํน์ง

Header, PayLoad, Signature๋ฅผ ์ ์Hedaer, PayLoad, Signature๋ฅผ ๊ฐ๊ฐ Base64๋ก ํ ๋ฒ ๋ ์ํธํํ์ฌ JWT๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ์ฟ ํค์ ๋ด์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ๊ธAuthorization header์ Access Token์ ๋ด์์ ์์ฒญHeader์ ๋ด์์ ๋ณด๋ธ JWT๊ฐ ๋ด ์๋ฒ์์ ๋ฐํํ ํ ํฐ์ธ์ง ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ์ผ์นํ๋ค๋ฉด ์ธ์ฆ์ ํต๊ณผ์์ผ์ฃผ๊ณ ์๋๋ผ๋ฉด ํต๊ณผ์ํค์ง ์์ผ๋ฉด ๋๋ค.๐ค ์๋ฒ๋ ํ ํฐ ์์ ๋ค์ด์๋ ์ ๋ณด๊ฐ ๋ฌด์์ธ์ง ์๋๊ฒ ์ค์ํ ๊ฒ์ด ์๋๋ผ ํด๋น ํ ํฐ์ด ์ ํจํ ํ ํฐ์ธ์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ JWT์ ํค๋, ํ์ด๋ก๋๋ฅผ ์๋ฒ์ key๊ฐ์ ์ด์ฉํด ์๊ทธ๋์ฒ๋ฅผ ๋ค์ ๋ง๋ค๊ณ ์ด๋ฅผ ๋น๊ตํ๋ฉฐ ์ผ์นํ์ ๊ฒฝ์ฐ ์ธ์ฆ์ ํต๊ณผ
๐ค JWT์ ์๋ช (์ธ์ฆ)์ด ๋ชฉ์
- JWT๋
Base64๋ก ์ํธํ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํด์ ์ธ์ฝ๋ฉ๋ JWT๋ฅผ 1์ด๋ง์ ๋ณตํธํ ๊ฐ๋ฅ- ๋ณตํธํ ํ๋ฉด ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ Payload ๋ถ๋ถ์ด ๊ทธ๋๋ก ๋ ธ์ถ -> ๊ทธ๋์ ํ์ด๋ก๋์๋ ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ฃ์ง ๋ง์
Header์ Payload๋ก Signature๋ฅผ ๋ง๋๋ฏ๋ก ๋ฐ์ดํฐ ์๋ณ์กฐ๋ฅผ ๋ง์ ์ ์๋ค.๋ฌด์ํ(StateLess)์ํ(Stateful)
- ํด๋ผ์ด์ธํธ์ ์ํ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ๊ณ ์ ์ง
- ์๋ฒ์ธก์์ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ๊ณ์ ์ ์งํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ง์ ๋ฉ๋ชจ๋ฆฌ ์๋ชจ
๋ฌด์ํ(Stateless)
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ๋ณด์กดํ์ง ์์
- ์๋ฒ๋ ๋จ์ํ ์์ฒญ์ด ์ค๋ฉด ์๋ต์ ๋ณด๋ด๋ ์ญํ ๋ง ์ํ
- ์๋ฒ๋ ๋จ์ํ ๋ฐ์์ ์๋ต๋ง ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ํ ์ ์ง์ ๋ํ ๋ถํ ๊ฐ์
JWT๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ์๋จ์ผ๋ก, ์ฟ ํค ๋ฐฉ์๊ณผ HTTP ํค๋ ๋ฐฉ์(์ฃผ๋ก Authorization ํค๋์ Bearer ์คํค๋ง ์ฌ์ฉ) ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Cookie cookie = new Cookie("accessToken", jwt);
cookie.setHttpOnly(true); // ์๋ฐ์คํฌ๋ฆฝํธ ์ ๊ทผ ๋ถ๊ฐ
ookie.setSecure(true); // HTTPS ํ๊ฒฝ์์๋ง ์ ์ก (๊ฐ๋ฐ ํ๊ฒฝ์์๋ false๋ก ์ค์ ๊ฐ๋ฅ)
cookie.setPath("/");
cookie.setMaxAge(3600); // 1์๊ฐ (์ด ๋จ์)
response.addCookie(cookie);
์ฌ์ค ์ค๋ jwt๋ฅผ ์ ๋ฆฌํ ์ด์ ๊ฐ ์ด๊ฒ ๋๋ฌธ์ด๋ค.
AccessToken์ ์ ํจ๊ธฐ๊ฐ์ด ์งง์ ๊ด์ฐฎ๋ค๊ณ ํด๋ ๋ง์ฝrefreshToken์ด๋ก๊ทธ์์์ด์ ์์ ์ ํ์ทจ๋ฅผ ๋นํ๋ฉด, ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ์๋ฒ์๊ฒ ํ์ทจํrefreshToken์ ๋ณด๋ผ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ๊ทธ๋์ ์๊ฐํ ๊ฒ์ด๋ธ๋๋ฆฌ์คํธ๊ธฐ๋ฒ์ด๋ค.
๋ก๊ทธ์์์ ์์ฒญ ํ๋ฉด, ํด๋ผ์ด์ธํธ๋ ์ฟ ํค๋ localstorage ์์ jwt๋ฅผ ์ ๊ฑฐํ๋ฉด ๋์ง๋ง ์๋ฒ๋ jwt๋ฅผ ๋ฌด๋ ฅํ ํ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ฐ๋ผ์ ์๋ฒ์์ Jwt์ ๋ํ ๋ธ๋๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด Jwt์ ์ ํจ ๊ธฐ๊ฐ์ด ๋ง๋ฃ ๋ ๋๊น์ง DB์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ธ๋๋ฆฌ์คํธ ๊ธฐ๋ฒ์ด๋ผ๊ณ ํ๋ค.Jwt ํ ํฐ์ด ๋ค์ด์ค๋ฉด ๊ฑฐ๋ถ๋ฅผ ํ๋ฉด ๋๋ค.๋ด๊ฐ ์ด ๊ธฐ๋ฒ์ ์ฐพ์๋ณด๋ฉด์ ์๊ฒผ๋ ์๋ฌธ์ ์ด๋ค. ๊ทธ๋์ ๊ฐ๋ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์ ๋ด ์๋ฌธ์ ์ ์ง๋ฌธํ์๋ค. JWT์์ ๋ธ๋๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ์ ์ดํด๋์ง ์์ต๋๋ค. jwt๋ Stateless ์ฅ์ ์ด์๋๋ฐ ์ Redis ๊ฐ์ ์ ์ฅ์๋ฅผ ์จ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋์?
๊ฒฐ๊ตญ์ ๊ด์ ์ ์ฐจ์ด์๋ค. ์ค์ ๋ก ๋ธ๋๋ฆฌ์คํธ ๊ธฐ์
์ ์ค๋ฌด์์๋ ๋ง์ด ์ฐ๊ณ Redis๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๊ณ ๋ชจ๋ ์ง ๊ธฐ์ ์ด ์๋ฒฝํ ์๋ ์๊ณ ๊ทธ ๋ฐฉ๋ฒ์ ์ด๋ป๊ฒ ์ ํด๊ฒฐํ๊ณ ์ ์ค๊ณํ๋๊ฒ์ด ๊ฐ๋ฐ์์ ๋ชซ์ธ๊ฒ ๊ฐ๋ค.
์ฐธ๊ณ :