| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- MySQL
- db์ํคํ ์ณ
- ์๊ณ ๋ฆฌ์ฆ
- ์ฝํ
- ์ค๋ธ์
- spring scheduler
- java์ฑํ
- docker
- db์ ๋ต
- ๋ ผ๋ธ๋กํน
- Jenkins
- Java
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- React
- @scheduler
- GoogleLogin
- dockerhub
- oauth
- ์ฝ๋ฉํ ์คํธ
- CICD
- spring
- injection๊ณต๊ฒฉ
- SpringBoot
- ์ฟ ๋ฒ๋คํฐ์ค
- ์๋ฐ
- Node.js
- ๋์์ธํจํด
- Personal Access Token
- ํฌ๋ก์ค์ฌ์ดํธ ์คํฌ๋ฆฝํธ
- node.js mysql ์ฐ๋
- Today
- Total
<Hello Hosung๐/>
[CS ์ง์] JWT(Json Web Token) ์ด๋ ๋ณธ๋ฌธ
[CS ์ง์] JWT(Json Web Token) ์ด๋
์ข์ถฉ์ฐ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ผ๊ธฐ๐ง 2024. 11. 16. 23:551. JWT๋ ๋ฌด์์ธ๊ฐ?
JWT๋ JSON Web Token์ ์ฝ์๋ก, ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํ ์ธ์ฆ ํ ํฐ์ ๋๋ค. JWT๋ ์ธ ๊ฐ์ง ์ฃผ์ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- ํค๋(Header): ํ ํฐ์ ํ์ ๊ณผ ์ฌ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ช ์ํฉ๋๋ค.
- ํ์ด๋ก๋(Payload): ์ธ์ฆ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ, ์ด ๋ฐ์ดํฐ๋ ํ ํฐ์ ๋ฐ๊ธํ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
- ์๋ช (Signature): ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ํธํ๋ ๋ถ๋ถ์ ๋๋ค.
JWT๋ ์ธ ๋ถ๋ถ์ด .(์ )์ผ๋ก ๊ตฌ๋ถ๋์ด ์์ต๋๋ค: header.payload.signature.
2. JWT์ ์๋ ์๋ฆฌ
JWT์ ์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ก๊ทธ์ธ: ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์, ์๋ฒ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ธํ ํ JWT๋ฅผ ์์ฑํฉ๋๋ค.
- ํ ํฐ ๋ฐ๊ธ: ์๋ฒ๋ ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ๋ด๊ธด JWT๋ฅผ ๋ฐ๊ธํ๊ณ ํด๋ผ์ด์ธํธ(๋ณดํต ๋ธ๋ผ์ฐ์ ๋ ์ฑ)๋ก ์ ๋ฌํฉ๋๋ค.
- ํ ํฐ ์ ์ฅ: ํด๋ผ์ด์ธํธ๋ ๋ฐ๊ธ๋ฐ์ JWT๋ฅผ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ ์ฟ ํค์ ์ ์ฅํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- ์์ฒญ ์ ํ ํฐ ์ ์ก: ์ดํ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค JWT๋ฅผ Authorization ํค๋์ ๋ด์ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์๋ฒ์์ ๊ฒ์ฆ: ์๋ฒ๋ ๋ฐ์ JWT๋ฅผ ์๋ช ๋ ํค๋ฅผ ์ด์ฉํด ๊ฒ์ฆํ๊ณ , ์ ํจํ ํ ํฐ์ด๋ฉด ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
3. JWT์ ๊ตฌ์ฑ
JWT๋ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค:
1) Header (ํค๋)
ํค๋๋ ํ ํฐ์ ํ์ (๋ณดํต JWT)๊ณผ ์๋ช ์ ์ฌ์ฉํ ์๊ณ ๋ฆฌ์ฆ์ ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด, HS256(HMAC SHA-256) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
{
"alg": "HS256",
"typ": "JWT"
}
2) Payload (ํ์ด๋ก๋)
ํ์ด๋ก๋์๋ ํด๋ ์(Claim)์ด ํฌํจ๋ฉ๋๋ค. ํด๋ ์์ JWT ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ก, ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค:
- ๋ฑ๋ก๋ ํด๋ ์(Registered Claims): iss (๋ฐ๊ธ์), exp (๋ง๋ฃ์๊ฐ) ๋ฑ.
- ๊ณต๊ฐ ํด๋ ์(Public Claims): ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ.
- ๋น๊ณต๊ฐ ํด๋ ์(Private Claims): ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์๋ง ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ.
์๋ฅผ ๋ค์ด:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
3) Signature (์๋ช )
์๋ช ์ ํค๋์ ํ์ด๋ก๋๋ฅผ ์กฐํฉํ์ฌ ๋น๋ฐ ํค๋ก ์๋ช ํ ๋ถ๋ถ์ ๋๋ค. ์ด๋ฅผ ํตํด JWT์ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํ ์ ์์ต๋๋ค.
์๋ช ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
4. JWT์ ์ฅ์
- ์ค์ผ์ผ๋ง ์ฉ์ด์ฑ: JWT๋ ์ํ๋ฅผ ์๋ฒ์ ์ ์ฅํ์ง ์๊ณ ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ๋ณด๊ดํ๋ฏ๋ก ์๋ฒ์ ๋ถํ๊ฐ ์ ๊ณ ํ์ฅ์ฑ์ด ๋ฐ์ด๋ฉ๋๋ค.
- ๋ณด์: ์๋ช ๋ JWT๋ ๋ณ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฉฐ, JWT๊ฐ ๋ฐ๊ธ๋๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ง์ ์ ์ธ ์ธ์ฆ ๊ณผ์ ์์ด๋ ์ธ์ฆ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์ ์ฐ์ฑ: ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํ๋ฉฐ, ๋ค์ํ ์์คํ ๊ฐ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๊ตํํ ์ ์์ต๋๋ค.
5. JWT ์ฌ์ฉ ์ฌ๋ก
JWT๋ ๋ค์๊ณผ ๊ฐ์ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ์ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค:
- ๋ก๊ทธ์ธ ์์คํ : ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ๋ฉด ์๋ฒ๋ JWT๋ฅผ ๋ฐ๊ธํ๊ณ , ํด๋ผ์ด์ธํธ๋ ์ด ํ ํฐ์ ์ ์ฅํ์ฌ ์๋ฒ์ ์์ฒญํ ๋๋ง๋ค ์ด๋ฅผ ์ ์กํฉ๋๋ค.
- API ์ธ์ฆ: RESTful API์ ๊ฐ์ ์น ์๋น์ค์์๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ ์์ฒญ์ JWT๋ฅผ ํฌํจ์์ผ API ์ ๊ทผ์ ํ์ฉํ ์ ์์ต๋๋ค.
6. JWT ์ฌ์ฉ ์ ๊ณ ๋ คํด์ผ ํ ๋ณด์ ์
JWT๋ ๊ฐ๋ ฅํ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ด์ง๋ง, ์๋ชป๋ ์ฌ์ฉ์ ๋ณด์ ์ทจ์ฝ์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค์์ ๋ณด์ ๊ฐํ๋ฅผ ์ํ ๋ช ๊ฐ์ง ํ์ ๋๋ค:
- ์๋ช ๋น๋ฐ ํค ๊ด๋ฆฌ: ๋น๋ฐ ํค๋ ๋งค์ฐ ์ค์ํ ๋ณด์ ์์์ด๋ฏ๋ก ์์ ํ๊ฒ ๋ณด๊ดํด์ผ ํ๋ฉฐ, ์ฃผ๊ธฐ์ ์ผ๋ก ๊ต์ฒดํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ํ ํฐ ๋ง๋ฃ ์๊ฐ ์ค์ : JWT์ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ์ฌ ํ ํฐ์ด ๋ฌดํํ ์ฌ์ฉ๋์ง ์๋๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, expํด๋ ์์ ์ฌ์ฉํ์ฌ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
- HTTP Only ์ฟ ํค ์ฌ์ฉ: ํด๋ผ์ด์ธํธ ์ธก์์ JWT๋ฅผ ์ ์ฅํ ๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋์ HTTP Only ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ณด์์ ์ ๋ฆฌํฉ๋๋ค.
- Refresh Token ์ฌ์ฉ: JWT๊ฐ ๋ง๋ฃ๋์์ ๋, ์๋ก์ด JWT๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ์๋๋ก Refresh Token์ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ์ธ์ฆ์ ๊ฐฑ์ ํฉ๋๋ค.
7. JWT๋ฅผ Node.js์์ ์ฌ์ฉํ๊ธฐ
Node.js์์ JWT๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์ดํด๋ด ๋๋ค. ๋จผ์ jsonwebtoken ํจํค์ง๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
npm install jsonwebtoken
JWT ์์ฑ
const jwt = require('jsonwebtoken');
// ์ ์ ์ ๋ณด์ ๋น๋ฐ ํค๋ฅผ ์ด์ฉํด JWT ์์ฑ
const token = jwt.sign({ userId: '123456' }, 'your-secret-key', { expiresIn: '1h' });
console.log(token);
JWT ๊ฒ์ฆ
const jwt = require('jsonwebtoken');
const token = 'JWT_TOKEN_HERE';
jwt.verify(token, 'your-secret-key', (err, decoded) => {
if (err) {
console.log('Token is invalid');
} else {
console.log('Decoded payload:', decoded);
}
});
8. ๋ง๋ฌด๋ฆฌ
JWT๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ธ์ฆ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ๊ทธ ์ฌ์ฉ์ ์์ด ๋ณด์์ ์ฃผ์ํ ์ ๋ค์ด ๋ง์ต๋๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ฉด, ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ณ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์์ ํ ๋ฐ์ดํฐ ์ ์ก์ ๋ณด์ฅํ ์ ์์ต๋๋ค. JWT๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ฑ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
'๐ CS Information' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [DB] ํจ์จ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ๋ฅผ ์ํ ๋ค์ํ ์ํคํ ์ณ (3) | 2024.11.15 |
|---|---|
| [CS ์ง์]Blocking/Non-Blocking, Sync/Async ๊ฐ๋ (0) | 2024.08.16 |
| [CS ์ง์]SQL Injection (0) | 2024.08.15 |
| [CS ์ง์]XSS(ํฌ๋ก์ค์ฌ์ดํธ ์คํฌ๋ฆฝํธ) (0) | 2024.08.15 |