session ๋ก๊ทธ์ธ๋ง ํด์ค๋ ๋ด๊ฐ JWT๋ฅผ..?
๋ฐ๋ก ์์ํ๊ฒ ์ต๋๋ค~
JWT๋ JSON Web Tokens ์ ์ค์ธ๋ง๋ก ์น์์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํ ํ์ค ๋ฐฉ์ ์ค ํ๋์ด๋ค
JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ณด๋ฅผ ์ํธํ๋ ๋ฌธ์์ด๋ก ํํํ๋ฉฐ
JWT๋ ํ ํฐ ์์ฒด๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์ด ๋ณ๋์ ์ ์ฅ ๊ณต๊ฐ์ด ํ์ ์๋ค!
=> ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ํ๋ฅผ ์ ์งํ์ง ์์
ํ์ง๋ง, ์ธ์
/์ฟ ํค ๋ฐฉ์์ ๋นํด JWT ํ ํฐ์ ๊ธธ์ด๊ฐ ๊ธธ๊ธฐ ๋๋ฌธ์
ํ ํฐ ๋ฐ๊ธ ๋ฐ ๊ฒ์ฆ ์์ฒญ์ด ๋ง์์ง์๋ก ์๋ฒ์์ ์์ ๋ญ๋น๊ฐ ๋ฐ์ํ๋ค๋ ๋จ์ ์ด ์๋ค
JWT๋ Header, Payload, Signature ์ธ ๊ฐ์ง ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค
Header๋ ํ ํฐ์ ์ ํ๊ณผ ํ ํฐ์ ์๋ช ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ํ๋ ๋ ๊ฐ์ง ๋ถ๋ถ์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค
Payload๋ ํ ํฐ์ ๋ด์ฉ์ด ์ธ์ฝ๋ฉ๋ ๋ถ๋ถ์ผ๋ก ์ํธํ๊ฐ ๋์ง ์์!
=> ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ฃ์ง X
Signature๋ ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํ๊ธฐ ์ํ ๋ถ๋ถ์ผ๋ก ํค๋์ ํ์ด๋ก๋๋ฅผ ์กฐํฉํ๊ณ , ๋น๋ฐ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช ๋ ๋ฌธ์์ด์
=> ์ด๋ฅผ ํตํด ํ ํฐ์ด ๋ณ์กฐ๋์ง ์์์์ ํ์ธํ ์ ์๋ค
์ต์ข ์ ์ผ๋ก ์ด๋ฌํ ์ธ ๋ถ๋ถ์ด ๋ง์นจํ๋ก ๊ตฌ๋ถ๋์ด ํ๋์ ๋ฌธ์์ด๋ก ํฉ์ณ์ ธ ์ต์ข JWT ํ ํฐ์ด ์์ฑ๋๋ค
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
(ํค๋์ ํ์ด๋ก๋๋ ์ธ์ฝ๋ฉ๋จ)
๊ทธ๋ผ ํ์ฌ ๊ฐ๋ฐ์ค์ธ Node.js ์์ JWT๊ฐ ์ด๋ค์์ผ๋ก ์ฌ์ฉ๋๋์ง ์์๋ณด์~
const jwt = require("jsonwebtoken");
const config = require("../configs");
const middleware = (req, res, next) => {
let token = req.headers["authorization"];
if (!token) {
return res.status(401).json({
message: "Unauthorized",
});
}
token = token.split(" ")[1] ?? "";
jwt.verify(token, config.auth.Key, (err, decoded) => {
if (err || !decoded.id || !decoded.username) {
return res.status(401).json({
message: "Unauthorized",
});
}
req.user = decoded;
next();
});
};
const genToken = (user) => {
return jwt.sign(user, config.auth.Key, {
expiresIn: "1d",
});
};
module.exports = {
middleware,
genToken,
};
auth.helper.js
์ฐ์ middleware๋ฅผ ์ดํด๋ณด๊ธฐ์ ์ getToken๋ถํฐ ์ดํด๋ณด์
์ด ์ฝ๋๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ์์์ JSON Web Token (JWT)์ ์์ฑํ๋ ํจ์์ด๋ค
=> ์ด ํจ์๋ ์ฌ์ฉ์ ์ ๋ณด์ ๋น๋ฐ ํค, ๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ์ ์ธ ์ต์ ์ ์ฌ์ฉํ์ฌ JWT๋ฅผ ์์ฑํจ
๋น๋ฐ ํค ๋ถ๋ถ์ ํ ํฐ์ ์์ฑํ ์๋ฒ์์๋ง ์๊ณ ์์ด์ผ ํจ!
์ถ๊ฐ์ ์ธ ์ต์
์ผ๋ก expiresIn: "1d"๋ฅผ ๋ณผ ์ ์๋๋ฐ
์ด๋ ํ ํฐ์ ์ ํจ ๊ธฐ๊ฐ์ ์ค์ ํ๋ ์ต์
์ผ๋ก, ์ฝ๋์์๋ 1์ผ๋ก ์ค์ ๋์ด ์๋ค
=> ์ด ๊ธฐ๊ฐ์ด ์ง๋๋ฉด ํ ํฐ์ ๋ง๋ฃ๋์ด ๋ ์ด์ ์ฌ์ฉํ ์ ์๊ฒ ๋จ
์ด๋ฐ์์ผ๋ก ๋ก๊ทธ์ธ ๋ก์ง์์ ์ ํจํ ์ฌ์ฉ์์ธ๊ฒ ์ธ์ฆ๋๋ฉด genToken์ ์ด์ฉํด JWT๋ฅผ ์์ฑํ๋ค
์ดํ์ ์ด ํ ํฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋์ด,
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋ ๋ง๋ค ์ด ํ ํฐ์ ํจ๊ป ์ ์กํ์ฌ ์ธ์ฆ์ ํ์ฉํ๋ค!
์ด์ middleware ๋ถ๋ถ์ ์ดํด๋ณด์!
ํด๋ผ์ด์ธํธ๊ฐ HTTP ํค๋์ "Authorization" ํ๋์ JWT๋ฅผ ๋ด์ ์๋ฒ๋ก ์ ์กํ๋ ์ํฉ์์
token ๋ณ์๋ก ํค๋์ ์๋ authorization ๋ด์ฉ์ ์ ์ฅํ๋ค
=> ๋ง์ฝ token ๋ณ์๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์๋ฌ๋ฅผ ์ ๋ฌํ๋ค
๊ทธ ํ, token.split(" ")[1] ?? ""์ ํตํด ์ค์ ํ ํฐ ๊ฐ๋ง์ ์ ์ฅํ๋๋ฐ
Authorization: Bearer ์ค์ ํ ํฐ ๊ฐ
"Bearer"๋ HTTP ํค๋์ ํ ํฐ์ ์ ์กํ ๋ ์ฌ์ฉ๋๋ ์ผ๋ฐ์ ์ธ ๊ท์ฝ ์ค ํ๋๋ก
HTTP ํค๋์ "Authorization" ํ๋์ ํ ํฐ์ ๋ฃ์ ๋, ์ผ๋ฐ์ ์ผ๋ก ์์ ๊ฐ์ด ์ฌ์ฉ๋๋ค
=> ์ด๋ ๋ฐ์ ํ ํฐ์์ "Bearer" ์คํด์ ์ ๊ฑฐํ๊ณ ์ค์ ํ ํฐ ๊ฐ๋ง์ ์ถ์ถํ๋ ์ญํ ์ ํ๋ค
?? ""๋ nullish ๋ณํฉ ์ฐ์ฐ์๋ก ๋ง์ฝ ์์ ์ค์ ํ ํฐ ๊ฐ์ด ์กด์ฌํ์ง ์์ null์ด๊ฑฐ๋ undefined๋ผ๋ฉด
๋ค์ ""(๋น ๋ฌธ์์ด) ๋ก ๋์ฒดํ๋ค
=> ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ง์ฝ ํ ํฐ์ด ์ ์ ํ๊ฒ ์ ๊ณต๋์ง ์์์ ๋, ๋น ๋ฌธ์์ด์ด ํ ๋น๋์ด ์๊ธฐ์น ์์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์์
๊ทธ ํ, jwt.verify ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋๋ฐ
์ด ๋ฉ์๋๋ ํ ํฐ, ๋น๋ฐ ํค, ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค
(๋น๋ฐํค๋ config.auth์ key๋ก ์ ์ฅ๋์ด ์์)
decoded๋ ํ ํฐ์ด ์ฑ๊ณต์ ์ผ๋ก ๊ฒ์ฆ๋๋ฉด ๋์ฝ๋ฉ๋ ํ์ด๋ก๋๋ฅผ ๋ํ๋ธ๋ค
=> ๋ง์ฝ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋์ฝ๋ฉ๋ ํ ํฐ์ ํ์ํ ์ ๋ณด(์ ์ฝ๋์์๋ id์ username)๊ฐ ์๋ค๋ฉด,
401 Unauthorized ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํจ
์ด๋ ๊ฒ ์ฑ๊ณต์ ์ผ๋ก ํ ํฐ์ด ๊ฒ์ฆ๋๋ฉด ๋์ฝ๋ฉ๋ ์ ๋ณด๋ฅผ req.user์ ์ ์ฅํ๋ค
Express์์๋ req๊ฐ์ฒด์ ์ฌ์ฉ์ ์ง์ ์์ฑ์ ์ถ๊ฐํ์ฌ
ํด๋น ์์ฒญ์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ํจํด
์ฆ, req.user = decoded๋ฅผ ์ํํ์ฌ req๊ฐ์ฒด์ user๋ผ๋ ์ฌ์ฉ์ ์ง์ ์์ฑ์ ์ถ๊ฐํ๋ฉด
์ดํ์ ๋ผ์ฐํธ ํธ๋ค๋ฌ์์๋ req.user๋ฅผ ํตํด ํด๋น ์ฌ์ฉ์ ์ ๋ณด์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๊ฒ ๋จ
req.user๋ ํ๋์ ์์ฒญ์ ๋ํ ๋ผ์ดํ์ฌ์ดํด ๋์๋ง ์ ์ง๋๋๋ฐ
ํ ๋ฒ์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด req.user๋ ์๋ฉธํ๊ฒ ๋๋ค!
=> ๊ฐ๊ฐ์ HTTP ์์ฒญ๋ง๋ค ์๋ก์ด req ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ
์ด๋ ๊ฒ ํน์ ์ฃผ์๋ก ๋ผ์ฐํ ํ๊ธฐ ์ ์ authHelper์ middleware๋ฅผ ์ถ๊ฐํ์ฌ ํ ํฐ์ ๊ฒ์ฆ์ ๋ง์น๊ณ ์คํ๋๊ฒ๋ ๊ตฌํํ๋ฉด ๋จ
'๐ซ Backend > Node' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Node.js] Nodemailer๋ฅผ ์ฌ์ฉํ์ฌ ํ์๊ฐ์ ์ ์ด๋ฉ์ผ ์ธ์ฆ ๊ตฌํํ๊ธฐ (0) | 2024.05.07 |
---|---|
AWS๋ฅผ ์ด์ฉํ์ฌ Node.js + MongoDB ๋ฐฐํฌํ๊ธฐ [Co-Code] (0) | 2024.04.06 |
CORS๋ ๋ฌด์์ผ๊น? (1) | 2024.02.04 |
TypeORM ์ด๋? (1) | 2024.01.28 |