์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
- ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๊ฐ ์ธ์
์ ์์ฑํ๊ณ , ํด๋ผ์ด์ธํธ์๊ฒ ์ธ์
ID๋ฅผ ๋ฐ๊ธํ๋ ๋ฐฉ์
์๋ฒ๋ ์ด ์ธ์ ID๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ๊ด๋ฆฌํจ - ๋์ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๋ ์ธ์ ์ ์์ฑํ๊ณ , ํด๋น ์ธ์ ID๋ฅผ ํด๋ผ์ด์ธํธ์ ์ฟ ํค๋ก ์ ๋ฌํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ดํ ์์ฒญ๋ง๋ค ์ด ์ธ์ ID๋ฅผ ์๋ฒ์ ์ ๋ฌํ์ฌ ์ธ์ฆ์ ํ์ธํ๋ค.
- ์๋ฒ๋ ์ธ์ ์ ์ฅ์์์ ์ธ์ ID๋ฅผ ํ์ธํ๊ณ , ํด๋ผ์ด์ธํธ๋ฅผ ์ธ์ฆํ๋ค.
- ์ฅ์ : ์๋ฒ์์ ๊ด๋ฆฌ๋๋ฏ๋ก ๋ณด์์ด ๋น๊ต์ ์ฝ๋ค.
- ๋จ์ : ์๋ฒ์ ์ธ์
์ ์ ์ฅํด์ผ ํ๋ฏ๋ก ์๋ฒ์ ์์์ด ๋ง์ด ์ฌ์ฉ๋๋ค.
์๋ฒ๊ฐ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ฏ๋ก, ์๋ฒ ๊ฐ ์ธ์ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๊ฐ ์ธ์ฆ ํ ํฐ์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๊ณตํ๊ณ ,
ํด๋ผ์ด์ธํธ๋ ์ดํ ์์ฒญ๋ง๋ค ์ด ํ ํฐ์ ์ฌ์ฉํด ์ธ์ฆ์ ๋ฐ๋ ๋ฐฉ์. - ๋์ ๋ฐฉ์:
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๋ ์ ์ผํ ๊ฐ์ธ ํ ํฐ์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ดํ ์์ฒญ์ ๋ณด๋ผ ๋ ์ด ํ ํฐ์ ํจ๊ป ํฌํจ์์ผ ์๋ฒ์ ์ ๋ฌํ๋ค.
- ์๋ฒ๋ ์ด ํ ํฐ์ ๊ฒ์ฆํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์ ํจํ ์ฌ์ฉ์์์ ํ์ธํ๋ค.
- ์ฅ์ : ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์งํ ํ์๊ฐ ์์ผ๋ฉฐ, ์๋ฒ ํ์ฅ์ด ์ฉ์ดํฉ๋๋ค. ๋ํ, ์๋ฒ์ ๋ณ๋์ ์ธ์ ์ ์ฅ์๊ฐ ํ์ํ์ง ์์ต๋๋ค.
- ๋จ์ : ํ ํฐ์ด ์ ์ถ๋๋ฉด ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ์ด ์งง์์ผ ํ๋ฏ๋ก ์์ฃผ ๊ฐฑ์ ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค.
- ๋ํ์ ์ฌ์ฉ์ ์ธ์ฆ ํ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ, ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- ์คํ๋ง ์ํ๋ฆฌํฐ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ ์ ๊ณต
- ํ ํฐ, ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ์ ์ผํ ๊ฐ
- ์๋ฒ๊ฐ ํ ํฐ์ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๊ณตํ๊ณ , ํด๋ผ์ด์ธํธ๋ ์ด ํ ํฐ์ ๊ฐ๊ณ ์๋ค๊ฐ ์ฌ๋ฌ ์์ฒญ์ ์ด ํ ํฐ๊ณผ ํจ๊ป ์ ์ฒญํ์ฌ ์ ํจํ ์ฌ์ฉ์์ธ์ง ์๋ฒ๊ฐ ๊ฒ์ฆ
์คํ๋ง ์ํ๋ฆฌํฐ์์ ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
์คํ๋ง ์ํ๋ฆฌํฐ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ ๊ณตํ๋ค. ๋ก๊ทธ์ธ ํ ์ธ์ ์ ์์ฑํ๊ณ , ์ธ์ ID๋ฅผ ์ฌ์ฉํด ํด๋ผ์ด์ธํธ๋ฅผ ์ธ์ฆํ๋ ๋ฐฉ์์ด๋ค. ํ์ง๋ง, ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ๋ ์คํ๋ง ์ํ๋ฆฌํฐ์์ ๊ตฌํํ ์ ์์ผ๋ฉฐ, JWT(JSON Web Token) ๋ฑ์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ๋ฅผ ์ธ์ฆํ๋ ๋ฐฉ์์ด ๋ง์ด ์ฌ์ฉ๋๋ค.
ํ ํฐ ๊ธฐ๋ฐ์ ํน์ง
- ๋ฌด์ํ์ฑ
์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๊ฐ ๋ด๊ฒจ ์๋ ํ ํฐ์ด ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ ์์ผ๋ฏ๋ก ์๋ฒ์ ์ ์ฅ ํ ํ์ ์์. ์๋ฒ ์์์ ๋ญ๋นํ์ง ์๊ฒ ๋จ
ํด๋ผ์ด์ธํธ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์ ์งํ์ง ์์๋ ๋๊ธฐ์ ์์ ํ ๋ฌด์ฌํ๋ก ํจ์จ์ ์ธ ๊ฒ์ฆ ๊ฐ๋ฅ - ํ์ฅ์ฑ
์ถํ ์๋ฒ ํ์ ์๋ ์ฉ์ดํ๋ค. - ๋ฌด๊ฒฐ์ฑ
ํ ํฐ ๋ฐ๊ธ ์ดํ ํ ํฐ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝ ํ ์ ์๋ค. ๋ง์ฝ ํ ํฐ์ ํ ๊ธ์๋ผ๋ ๋ณ๊ฒฝํ๋ฉด ์๋ฒ๋ ์ ํจํ์ง ์์ ํ ํฐ์ด๋ผ ํ๋จ
JWT
JSON Web Token (JWT) ์ ์นํ์ค (RFC 7519) ์ผ๋ก์ ๋ ๊ฐ์ฒด์์ JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ๊ณ ์๊ฐ์์ฉ์ ์ธ (self-contained) ๋ฐฉ์์ผ๋ก ์ ๋ณด๋ฅผ ์์ ์ฑ ์๊ฒ ์ ๋ฌํด์ค๋๋ค.
jwt ๊ตฌ์กฐ
ํค๋(Header)
- ํ ํฐ์ ํ์ ๊ณผ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ํ๋ ์ ๋ณด ๋ด์
{
"type": "JWT",
"alg": "HS256"
}
์ด๋ฆ | ์ค๋ช |
typ | ํ ํฐ์ ํ์ ์ง์ . JWT ๋ผ๋ ๋ฌธ์์ด์ด ๋ค์ด๊ฐ๊ฒ ๋จ |
alg | ํด์ฑ ์๊ณ ๋ฆฌ์ฆ ์ง์ |
๋ด์ฉ(payload)
- ๋ด์ฉ์๋ ํ ํฐ๊ณผ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
- ํด๋ ์claim
- ๋ด์ฉ์ ํ ๋ฉ์ด๋ฆฌ
- ํค๊ฐ์ ํ ์์ผ๋ก ์ด๋ฃจ์ด์ง
- ๋ฑ๋ก๋ ํด๋ ์, ๊ณต๊ฐ ํด๋ ์, ๋น๊ณต๊ฐ ํด๋ ์์ผ๋ก ๋๋ ์ ์๋ค.
๋ฑ๋ก๋ ํด๋ ์
์ด๋ฆ | ์ค๋ช |
iss | ํ ํฐ ๋ฐ๊ธ์(issuer) |
sub | ํ ํฐ ์ ๋ชฉ (subject) |
aud | ํ ํฐ ๋์์(audience) |
exp | ํ ํฐ์ ๋ง๋ฃ์๊ฐ(expiraton). ์๊ฐ NumericDate ํ์์ผ๋ก ํ๋ฉฐ, ํญ์ ํ์ฌ ์๊ฐ ์ดํ๋ก ์ค์ ํฉ๋๋ค. |
nbf | ํ ํฐ์ ํ์ฑ ๋ ์ง์ ๋น์ทํ ๊ฐ๋ ์ผ๋ก nbf๋ Not Before ์๋ฏธ. NumericDate ํ์์ผ๋ก ๋ ์ง๋ฅผ ์ง์ ํ๋ฉฐ, ์ด ๋ ์ง๊ฐ ์ง๋๊ธฐ ์ ๊น์ง๋ ํ ํฐ์ด ์ฒ๋ฆฌ ๋์ง ์์ต๋๋ค. |
iat | ํ ํฐ์ด ๋ฐ๊ธ๋ ์๊ฐ์ผ๋ก iat์ issued at์ ์๋ฏธ |
jti | JWT์ ๊ณ ์ ์๋ณ์๋ก์ ์ฃผ๋ก ์ผํ์ฉ ํ ํฐ์ ์ฌ์ฉ |
๊ณต๊ฐ ํด๋ ์
- ๊ณต๊ฐ๋์ด๋ ์๊ด ์๋ ํด๋ ์
- ์ถฉ๋ ๋ฐฉ์งํ ์ ์๋ ์ด๋ฆ์ ๊ฐ์ ธ์ผํจ. ๋ณดํต ํด๋ ์ ์ด๋ฆ์ URI๋ก ์ง์
๋น๊ณต๊ฐ ํด๋ ์
- ๊ณต๊ฐ๋๋ฉด ์๋๋ ํด๋ ์์ ์๋ฏธ
- ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ์ฌ์ฉ
jwt์์
{
"iss": "example@gmail.com", // ๋ฑ๋ก๋ ํด๋ ์
"iat": 1622370878, // ๋ฑ๋ก๋ ํด๋ ์
"exp": 1622372678, // ๋ฑ๋ก๋ ํด๋ ์
"https://rara.com/jwt_claims/is_admin": true, // ๊ณต๊ฐ ํด๋ ์
"email": "example@gmail.com", // ๋น๊ณต๊ฐ ํด๋ ์
"hello": "Hello world" // ๋น๊ณต๊ฐ ํด๋ ์
}
์ฑ๋ช (signature)
- ํด๋น ํ ํฐ์ด ์กฐ์๋์๊ฑฐ๋ ๋ณ๊ฒฝ๋์ง ์์์์ ํ์ธํ๋ ์ฉ๋
- ํค๋์ ์ธ์ฝ๋ฉ๊ฐ๊ณผ ๋ด์ฉ์ ์ธ์ฝ๋ฉ ๊ฐ์ ํฉ์น ํ ์ฃผ์ด์ง ๋น๋ฐํค๋ฅผ ์ฌ์ฉํด ํด์๊ฐ์ ์์ฑ
ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ
๋๋ถ๋ถ์ ์ธ์ฆ ์์คํ ์์๋ ๋ณด์์ ์ํด ์ก์ธ์ค ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ์ ์งง๊ฒ ์ค์
ํ์ง๋ง ์ ํจ๊ธฐ๊ฐ์ด ์งง๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์๊ฐ ๊ณ์ํด์ ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ์ป์ด์ผ ํ ํ์ํจ์ด ์๊ธด๋ค.
์ด๋, ์ฌ์ฉ์๋ ๋ค์ ๋ก๊ทธ์ธํ ํ์ ์์ด ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฌ์ฉํด ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋ฐ์ ์ ์๋ค.
์ก์ธ์ค ํ ํฐ Access Token
- ์ฌ์ฉ์๊ฐ ํน์ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌ๋ฐ์๋ค๋ ๊ฒ์ ๋ํ๋ด๋ ์ธ์ฆ ํ ํฐ
- ์๋ฒ๊ฐ ์ฌ์ฉ์์ ์ ์์ ํ์ธํ๊ณ , ํด๋น ์ฌ์ฉ์๊ฐ ์์ฒญํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ์๋์ง ํ์ธํ ๋ ์ฌ์ฉ
- ๋ฆฌํ๋ ์ ํ ํฐ์ ๋นํด ์งง์ ๋ง๋ฃ ๊ธฐ๊ฐ
๋ฆฌํ๋ ์ ํ ํฐ Refresh Token
- ์ก์ธ์ค ํ ํฐ๊ณผ ๋ณ๊ฐ์ ํ ํฐ
- ํด๋ผ์ด์ธํธ๊ฐ ์ก์ธ์ค ํ ํฐ์ด ์๊ฑฐ๋ ๋ง๋ฃ์ ๋ฆฌํ๋ ์ ํ ํฐ์ ํตํด ์๋ฒ์ ์์ฒญํ์ฌ ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ ๋ฐ์ ์ ์๋ค.
- Access Token์ ๋นํด์ ๊ธด ๋ง๋ฃ ๊ธฐ๊ฐ
- ์ธ๋ถ์ ๋ ธ์ถ๋์ง ์๋๋ก ๊ด๋ฆฌ๋ฅผ ์ํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ
JWT ์ธ์ฆ๊ณผ์
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ธ์ฆ ์์ฒญ
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ์์ ์ ๋ฌํ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ธ์ฆ์ ๋ณด ์ ํจํ์ง ํ์ธ ํ,
์ก์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ ํ ํฐ ์์ฑ ํ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ. ํด๋ผ์ด์ธํธ๋ ์ ๋ฌ ๋ฐ์ ํ ํฐ ์ ์ฅ - ์๋ฒ์์ ์์ฑํ ๋ฆฌํ๋ ์ ํ ํฐ DB ์ ์ฅ
- ์ธ์ฆ์ ํ์๋ก ํ๋ API๋ฅผ ํธ์ถํ ๋, ํด๋ผ์ด์ธํธ๋ ์ ์ฅ๋ ์ก์ธ์ค ํ ํฐ๊ณผ ํจ๊ป API๋ฅผ ์์ฒญ
- ์๋ฒ์์ ์ ๋ฌ๋ฐ์ ์ก์ธ์ค ํ ํฐ ์ ํจํ์ง ๊ฒ์ฌํ ํ ์ ํจํ๋ค๋ฉด ํด๋ผ์ด์ธํธ์์ ์์ฒญํ ๋ด์ฉ ์ฒ๋ฆฌ
- ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋ ๋ค์ ํด๋ผ์ด์ธํธ๊ฐ ๋ง๋ฃ๋ ์์ธ์ค ํ ํฐ๊ณผ ํจ๊ป API๋ฅผ ์์ฒญ
- ์๋ฒ๋ ์ก์ธ์ค ํ ํฐ์ด ์ ํจํ์ง ๊ฒ์ฌ. ๋ง๋ฃ๋ ํ ํฐ์ด๋ฉด ํ ํฐ์ด ๋ง๋ฃ๋์๋ค๋ ์๋ฌ ์ ๋ฌ
- ํด๋ผ์ด์ธํธ๋ ์ ์ฅํด๋ ๋ฆฌํ๋ ์ ํ ํฐ๊ณผ ํจ๊ป ์๋ก์ด ์์ธ์ค ํ ํฐ์ ๋ฐ๊ธํ๋ ์์ฒญ์ ์๋ฒ์๊ฒ ์ ์ก
- ์๋ฒ๋ ์ ๋ฌ๋ฐ์ ๋ฆฌํ๋ ์ ํ ํฐ ์ ํจํ์ง, DB์์ ๋ฆฌํ๋ ์ ํ ํฐ ์กฐํ ํ ์ ์ฅํด๋ ๋ฆฌํ๋ ์ ํ ํฐ๊ณผ ๊ฐ์์ง ํ์ธ
- ๋ง์ฝ ์ ํจํ ๋ฆฌํ๋ ์ ํ ํฐ์ผ ๊ฒฝ์ฐ ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ์์ฑํ ๋ค ์๋ต
๊ทธ ์ดํ ํด๋ผ์ด์ธํธ๋ ๋ค์ API ์์ฒญ์ ํ๊ฒ๋๋ค.
์ฐธ๊ณ
ํด๋น ๊ธ์ ์๋ ๋์์ ๋ด์ฉ์ ์ฐธ๊ณ ํ๋ฉฐ ์ ๋ฆฌํ ๊ฐ์ธํ์ต์ฉ ๊ธ์
๋๋ค.
์คํ๋ง ๋ถํธ 3 ๋ฒก์๋ ๊ฐ๋ฐ์ ๋๊ธฐ - ์๋ฐ ํธ, ์ ์ ์
https://velog.io/@yh20studio/ํ ํฐ-๊ธฐ๋ฐ-์ธ์ฆ-์์คํ -JWT
'TIL > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
OAuth2 ์ค์ ํ์ผ ์์ฑํ๊ธฐ (0) | 2024.10.04 |
---|---|
Spring Security ํ์ผ ์ค์ ํ๊ธฐ (0) | 2024.10.04 |
thymeleaf layout ์ ์ฉํ๊ธฐ (header, footer, main) (0) | 2024.01.26 |
jre jdk ์ฐจ์ด (0) | 2024.01.18 |
java lombok annotation ์์๋ณด์ (0) | 2024.01.14 |