๐JWT ํ ํฐ
JWT(JSON Web Token)์ด๋ ์น ํ์ค์ผ๋ก, ์ฃผ๋ก ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ ๋ณด ๊ตํ์ ์ฌ์ฉ๋๋ค. JWT๋ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ๊ฐ ํค๋, ํ์ด๋ก๋, ์๊ทธ๋์ฒ๋ก ๋๋๋ค. ํค๋๋ ํ ํฐ์ ์ ํ๊ณผ ์๋ช ์๊ณ ๋ฆฌ์ฆ์ ํฌํจํ๋ฉฐ, ํ์ด๋ก๋๋ ์ฌ์ฉ์ ์ ๋ณด์ ๊ฐ์ ํด๋ ์์ ํฌํจํ๋ฉฐ, ์๊ทธ๋์ฒ๋ ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ค.
JWT๋ ์ฃผ๋ก OAuth์ ๊ฐ์ ์ธ์ฆ ์์คํ ์์ ์ฌ์ฉ๋๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์์ ํ ์ ๋ณด ๊ตํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ์๋ํ๋ฉด JWT๋ ์์ฒด์ ์ผ๋ก ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์ด ์๋ฒ์ ์ํ๋ฅผ ์ ์งํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํค๋ | ํ ํฐ์ ์ ํ๊ณผ ์๋ช ์๊ณ ๋ฆฌ์ฆ์ ํฌํจํ๋ค. | {"alg": "HS256", "typ": "JWT"} |
ํ์ด๋ก๋ | ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํฌํจํ๋ค. | {"sub": "1234567890", "name": "John Doe", "iat": 1516239022} |
์๊ทธ๋์ฒ | ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ค. | ํค๋์ ํ์ด๋ก๋๋ฅผ ์ธ์ฝ๋ฉํ ํ, ์ํฌ๋ฆฟ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๋ค. ์ด๋ ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ค. |
๐JWT ํ ํฐ ๋ฐ๊ธ๊ณผ ๊ฒ์ฆ
JWT๋ ์ฃผ๋ก ์๋ฒ์์ ๋ฐ๊ธ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ์ด๋ฅผ ์ ์ฅํ๊ณ ์์ฒญ ์๋ง๋ค ์๋ฒ์ ์ ๋ฌํ๋ค.
๋ฐ๊ธ ๊ณผ์ ์: ํค๋์ ํ์ด๋ก๋๋ฅผ JSON์ผ๋ก ๋ง๋ค๊ณ , ์ด๋ฅผ Base64URL๋ก ์ธ์ฝ๋ฉํ๋ค. ๊ทธ๋ฐ ๋ค์ ์ํฌ๋ฆฟ ํค์ ๊ฒฐํฉํ์ฌ ์๊ทธ๋์ฒ๋ฅผ ์์ฑํ๋ค.
์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ JWT๋ฅผ ๊ฒ์ฆํ๋ค. ํค์ด์ ํ์ด๋ก๋๋ฅผ ๋์ฝ๋ฉํ๊ณ , ์๊ทธ๋์ฒ๋ฅผ ํ์ธํ์ฌ ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๋ค. ์๋ํ๋ฉด ์๊ทธ๋์ฒ๊ฐ ์ ํจํ์ง ์์ผ๋ฉด ํ ํฐ์ด ๋ณ์กฐ๋์์ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. JWT๋ ๋ง๋ฃ ์๊ฐ์ด ํฌํจ๋ ์ ์์ผ๋ฉฐ, ๋ง๋ฃ๋ ํ ํฐ์ ์ฌ๋ฐ๊ธ ๋ฐ์์ผ ํ๋ค.
* Spring์์๋ ๋ณดํต jjwt (Java JWT) ๋๋ Spring Security์ ํจ๊ป JWT๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ ๋ฐ ๊ถํ ๊ด๋ฆฌ๋ฅผ ์ํํ๋ค.
1. JWT ๋ฐ๊ธ
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์๋ฒ(SPRING)๊ฐ JWT๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค.๋ฐ๊ธ ์ userId, roles ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจํ๋ฉฐ, ๋น๋ฐ ํค(secretKey)๋ก ์๋ช ํฉ๋๋ค.
2. JWT ์ ์ฅ
ํด๋ผ์ด์ธํธ๋ ๋ฐ๊ธ๋ฐ์ JWT๋ฅผ HTTP ํค๋(์: Authorization: Bearer <JWT>) ๋๋ ์ฟ ํค์ ์ ์ฅํฉ๋๋ค.์ฌ์ฉ์ ์์ฒญ๋ง๋ค ํด๋น ํ ํฐ์ ์๋ฒ๋ก ์ ๋ฌํ์ฌ ์ธ์ฆ์ ์ฌ์ฉํฉ๋๋ค.
3. JWT ๊ฒ์ฆ
ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ JWT๋ฅผ ์๋ฒ์์ ํ์ธํ๊ณ , ์๋ช ๊ณผ ๋ง๋ฃ ์๊ฐ(expiresIn)์ ๊ฒ์ฆํฉ๋๋ค.์ ํจํ๋ค๋ฉด ํ ํฐ์ payload์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ ์ธ์ฆ ์ํ๋ฅผ ์ค์ ํฉ๋๋ค.
*Base64URL๋ก ์ธ์ฝ๋ฉ ๋๋ ์ด์
- ๋ชฉ์ :
๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํ ์คํธ ํ์์ผ๋ก ๋ณํํ๊ฑฐ๋, URL-safe(์์ ํ URL) ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ธฐ ์ํจ. - ๋ฐฉ์:
Base64 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋๋ฐ, URL์์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ +, /, =๋ฅผ ๊ฐ๊ฐ -, _, ์ ๊ฑฐ๋ก ๋์ฒดํฉ๋๋ค.
์ด ๋ฐฉ์์ Base64์ ๋ณํ์ผ๋ก URL์์ ์์ ํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
๐JWT ํ ํฐ ๋ฐ๊ธ๊ณผ ๊ฒ์ฆ
*JWT๋ฅผ URL์ ํฌํจํ๋ ๊ฒ์ด ์ ํฉํ ๊ฒฝ์ฐ
1. OAuth 2.0 ๋ฆฌ๋ค์ด๋ ์ ์๋๋ฆฌ์ค
OAuth 2.0์ Authorization Code Grant ๋ฐฉ์์์๋, ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ ์๋ฃํ ํ ์ธ์ฆ ์๋ฒ๊ฐ ๋ฆฌ๋ค์ด๋ ์ URL์ ํตํด Authorization Code๋ฅผ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฌํฉ๋๋ค. (๋ฆฌ๋ค์ด๋ ์ ์๋ต์ ๋ฐ์ผ๋ฏ๋ก URL์ ํตํด์ ํ ํฐ์ ์ ๋ฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ์์ด๋ค.
https://example.com/callback?code=abc123&state=xyz
2. ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋๋ ์ด๋ฉ์ผ ์ธ์ฆ ๋งํฌ ๋ฑ
(์ถํ ์ ๋ฐ์ดํธ ์์ )
๐์ฐธ๊ณ
https://f-lab.kr/insight/jwt-token-structure-and-usage-20240603
'๐CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ(Cloud Native) (1) | 2024.12.08 |
---|---|
Git ๋ธ๋์น ์ ๋ต (1) | 2024.12.06 |
JavaScript์ ๋น๋๊ธฐ์ ์ด๋ฒคํธ ๋ฃจํ (0) | 2024.11.21 |
๊ฐ๋ฐ ์ธ์ด (1) | 2024.11.20 |
๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP, Object-Oriented Programming) (0) | 2024.11.20 |