2023. 9. 11. 14:32ใ3. Node.js
JWT(Json Web Token)
JWT(Json Web Token)์ ์น ํ์ค์ผ๋ก์จ, ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํด ๋์์ ์ฃผ๋ ์น ํ ํฐ(Web Token)์ด๋ค.
JSON ํํ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์กํ๊ณ ๊ฒ์ฆํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต.
์ธํฐ๋ท ํ์ค์ผ๋ก์ ์๋ฆฌ ์ก์ ๊ท๊ฒฉ์ด๋ค.
๋ค์ํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์์ด, ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ค.
header/ payload/ signature์ ํ์์ผ๋ก 3๊ฐ์ง์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ค. (๊ฐ๋ฏธ์ฒ๋ผ ๋จธ๋ฆฌ, ๊ฐ์ด, ๋ฐฐ)
์ถ๊ฐ๋ก ํน์ง์ ๋ ์์๋ณด์๋ฉด,
1) JWT๋ ๋น๋ฐ ํค๋ฅผ ๋ชจ๋ฅด๋๋ผ๋ ๋ณตํธํ(Decode)๊ฐ ๊ฐ๋ฅํ๋ค.
JWT๋ฅผ ๊ฐ์ง ์ฌ๋์ด๋ผ๋ฉด ๋๊ตฌ๋ ํด๋น ํ ํฐ์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ์๋์ง ํ์ธํ ์ ์๋ค.
๋ณ์กฐ๋ง ๋ถ๊ฐ๋ฅ ํ ๋ฟ, ๋๊ตฌ๋ ๋ณตํธํํ์ฌ ๋ณด๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ๊ฐ ๋๋ค.
2) ๋ฏผ๊ฐํ ์ ๋ณด(๊ฐ์ธ์ ๋ณด, ๋น๋ฐ๋ฒํธ ๋ฑ)๋ ๋ด์ง ์๋๋ก ํด์ผ ํ๋ค.
JWT์ ํ์ด๋ก๋๋ ๋๊ตฌ๋ ๋ณตํธํํ์ฌ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
3) JavaScript์ ๊ฐ์ด ํน์ ์ธ์ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ค.
JWT๋ ๋จ์ํ ๋ฐ์ดํฐ ํ์์ผ ๋ฟ, ๋จ์ง ๊ฐ๋ ์ผ๋ก์ ์กด์ฌํ๊ณ , ์ด ๊ฐ๋ ์ ์ฝ๋๋ก ๊ตฌํํ์ฌ ๊ณต๊ฐ๋ ์ฝ๋๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๊ฒ ์ผ๋ฐ์ ์ด๋ค.
[ JWT์ฌ์ฉ๋ฐฉ๋ฒ ]
1) jsonwebtoken ์คํ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ JWT๋ฅผ ์ด์ฉํ๋ค.
# yarn์ ์ด์ฉํด ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
yarn init -y
# jsonwebtoken, express ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
yarn add jsonwebtoken express
* ์ด๋, yarn์ ์ด์ฉํด ์์ฑ๋ package.json ํ์ผ์์ type์ module๋ก ๊ผญ! ๋ณ๊ฒฝํด์ํ๋ค.
2) JSON ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ค.
jsonwebtoken ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ sign ๋ฉ์๋๋ฅผ ์ฌ์ฉํด JWT๋ฅผ ์์ฑํ๋ค.
import jwt from 'jsonwebtoken';
const token = jwt.sign({ myPayloadData: 1234 }, 'mysecretkey');
console.log(token); // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2OTA4NzM4ODV9.YUmYY9aef9HOO8f2d6Umh2gtWRXJjDkzjm5FPhsQEA0
* sign ๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก Payload ๋ฐ์ดํฐ๋ฅผ, ๋ ๋ฒ์งธ ์ธ์๋ก ๋น๋ฐ ํค๋ฅผ ๋ฐ์ JWT๋ฅผ ์์ฑํ๋ค.
→ ์ฌ๊ธฐ์, Payload๋ ๋ฌธ์์ด๋ฟ๋ง ์๋๋ผ, ๊ฐ์ฒด๋ ํ ๋นํ ์ ์๋ค.
3) ๋ณตํธํํด๋ณด๊ธฐ
- jsonwebtoken ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ decode ๋ฉ์๋๋ฅผ ์ฌ์ฉํด JWT๋ฅผ ๋ณตํธํํ๋ค.
import jwt from 'jsonwebtoken';
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2OTA4NzM4ODV9.YUmYY9aef9HOO8f2d6Umh2gtWRXJjDkzjm5FPhsQEA0";
const decodedValue = jwt.decode(token);
console.log(decodedValue); // { myPayloadData: 1234, iat: 1690873885 }
- jsonwebtoken ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ verify ๋ฉ์๋๋ฅผ ์ฌ์ฉํด JWT๋ฅผ ๊ฒ์ฆ์ด ๊ฐ๋ฅํ๋ค.
import jwt from 'jsonwebtoken';
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2OTA4NzM4ODV9.YUmYY9aef9HOO8f2d6Umh2gtWRXJjDkzjm5FPhsQEA0";
const decodedValueByVerify = jwt.verify(token, "mysecretkey");
console.log(decodedValueByVerify); // { myPayloadData: 1234, iat: 1690873885 }
* JWT๊ฐ ๋ณ์กฐ๋์ง ์์๊ณ , ์ฌ๋ฐ๋ฅธ ๋น๋ฐ ํค๋ก ์๋ช ๋์๋์ง๋ฅผ ๊ฒ์ฆ. ๊ฒ์ฆ์ ์คํจํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
import jwt from 'jsonwebtoken';
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2OTA4NzM4ODV9.YUmYY9aef9HOO8f2d6Umh2gtWRXJjDkzjm5FPhsQEA0";
const decodedValueByVerify = jwt.verify(token, "secretkey");
console.log(decodedValueByVerify);
// JsonWebTokenError: invalid signature
* ์๋ชป๋ ๋น๋ฐํค (mysecretkey๋ฅผ secretkey๋ก ๋ณ๊ฒฝํด์) ์คํ. ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋์ด, ๊ฒ์ฆ์ ์คํจํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
[ JWT๋ฅผ ์ ์ฉํ ๋ก๊ทธ์ธ API ์์ ]
import express from 'express';
import JWT from 'jsonwebtoken';
const app = express();
app.post('/login', (req, res) => {
// ์ฌ์ฉ์ ์ ๋ณด
const user = {
userId: 203,
email: 'archepro84@gmail.com',
name: '์ด์ด๋ฆ',
};
// *** userJWT๋ฅผ ๋ณ์๋ก ์ ์ธํ๋ค. JWT.sign์ด๋ผ๋ ๋ช
๋ น์ด๋ฅผ ํตํด
// ์์ ์ฌ์ฉ์์ ๋ณด๋ฅผ payload์๋ฃ์ด์ค
// ์ฌ์ฉ์ ์ ๋ณด๋ฅผ JWT๋ก ์์ฑ
const userJWT = JWT.sign(
user, // user ๋ณ์์ ๋ฐ์ดํฐ๋ฅผ payload์ ํ ๋น
'secretOrPrivateKey', // JWT์ ๋น๋ฐํค๋ฅผ secretOrPrivateKey๋ผ๋ ๋ฌธ์์ด๋ก ํ ๋น
{ expiresIn: '1h' }, // JWT์ ์ธ์ฆ ๋ง๋ฃ์๊ฐ์ 1์๊ฐ์ผ๋ก ์ค์
);
// userJWT ๋ณ์๋ฅผ sparta ๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ์ฟ ํค์ Bearer ํ ํฐ ํ์์ผ๋ก ํ ๋น
// *** bearer์ ํ ํฐ์ ์ ๋ฌํ๋ ํ๋์ ํ์์ด๋ค!
res.cookie('sparta', `Bearer ${userJWT}`);
return res.status(200).end();
});
app.listen(5002, () => {
console.log(5002, '๋ฒํธ๋ก ์๋ฒ๊ฐ ์ผ์ก์ด์!');
});

'3. Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ Node.js ์๋ จ์ฃผ์ฐจ1 (1-0)] noSQL vs SQL (0) | 2023.09.11 |
|---|---|
| [ Node.js ์๋ จ์ฃผ์ฐจ1 (1-0)] ORM๊ณผ Prisma (0) | 2023.09.10 |
| [ Node.js ์๋ จ์ฃผ์ฐจ1 (1-13)] Prisma ๊ฒ์ํ ์ฌ์ดํธ ์ค๊ณ ( ์ธ๋ํค, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๊ณ ) (1) | 2023.09.06 |
| [ Node.js ์๋ จ์ฃผ์ฐจ1 (1-9)] ์ฟ ํค์ ์ธ์ (0) | 2023.09.05 |
| [ Node.js ์๋ จ์ฃผ์ฐจ1 (1-3)] SQL (Structured Query Language) ์ดํด๋ณด๊ธฐ (0) | 2023.09.03 |