노드에서 JWT가 있는 쿠키를 사용합니다.js
27477 단어 nodejavascript
JWT를 사용하여 간단한 인증과 권한 수여 시스템을 만드는 방법에 대한 글을 읽었다면 로그인 루트에서 http 요청을 보낼 때 응답으로 JWT를 보낼 것입니다.즉, 로컬 스토리지에 저장하는 것이 우리의 생각입니다.
단, 다른 방법은 jwt를 전방으로 보낼 수 있습니다. 오늘은 jwt를 쿠키에 저장하는 방법을 가르쳐 드리겠습니다.
과자를 왜 써요?
때때로 나는 좀 게으르다. 그렇기 때문에, 내가 Api에게 요청을 할 때마다, 나는 헤더 파일에서 jwt를 계속 보내고 싶지 않다.이것이 바로 쿠키의 용도입니다. http 요청을 보낼 때 걱정하지 않아도 됩니다.
또 다른 이유는 localstorage를 사용하면 사용자가 로그아웃할 때localstorage에서 jwt를 삭제해야 하기 때문입니다.쿠키를 사용할 때api에서 http 요청을 보내서 전방의 쿠키를 삭제할 수 있습니다.
쿠키를 사용하는 데는 몇 가지 이유가 있습니다. 여기서 저는 프로젝트를 세분화하는 과정에서 나타날 수 있는 표면적인 예를 제시했습니다.
지금 우리는 대체적인 생각이 하나 생겼으니, 우리 인코딩합시다.
저희가 인코딩을 해볼게요.
우선 다음과 같은 종속성을 설치합니다.
npm install express jsonwebtoken cookie-parser
이제 간단한 Api를 만들기만 하면 됩니다.const express = require("express");
const app = express();
app.get("/", (req, res) => {
return res.json({ message: "Hello World 🇵🇹 🤘" });
});
const start = (port) => {
try {
app.listen(port, () => {
console.log(`Api up and running at: http://localhost:${port}`);
});
} catch (error) {
console.error(error);
process.exit();
}
};
start(3333);
예상하신 바와 같이 Api에서 쿠키를 사용할 수 있는 것이 필요합니다. 이것이 바로 cookie-parser의 용무지입니다.우선, 우리는 그것을 수입하여 우리의 중간 제품에 등록할 것이다.
const express = require("express");
const cookieParser = require("cookie-parser");
const app = express();
app.use(cookieParser());
//Hidden for simplicity
이제 Api에서 라우트를 작성할 준비가 되었습니다.우리가 만들 첫 번째 루트는 로그인 루트입니다.먼저 jwt를 만들고 "access token"이라는 쿠키에 저장합니다.쿠키는 httpOnly(응용 프로그램 개발 기간에 사용)와 secure(생산 환경에서https 사용) 등 몇 가지 옵션이 있습니다.
그리고 우리는 우리가 성공적으로 로그인했다는 답장을 보낼 것이다.
app.get("/login", (req, res) => {
const token = jwt.sign({ id: 7, role: "captain" }, "YOUR_SECRET_KEY");
return res
.cookie("access_token", token, {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
})
.status(200)
.json({ message: "Logged in successfully 😊 👌" });
});
현재 로그인이 완료된 후에 클라이언트에서 jwt가 있는 쿠키를 받았는지 확인하겠습니다. 이 예에서 저는 Insomnia를 사용했습니다.이제 인증이 완료되면 권한을 부여하겠습니다.이를 위해, 우리는 쿠키가 있는지 확인하기 위해 중간부품을 만들어야 합니다.
const authorization = (req, res, next) => {
// Logic goes here
};
현재 "access token"이라는 쿠키가 있는지 확인해야 합니다. 없으면 컨트롤러에 접근하는 것을 금지합니다.const authorization = (req, res, next) => {
const token = req.cookies.access_token;
if (!token) {
return res.sendStatus(403);
}
// Even more logic goes here
};
만약 우리가 쿠키가 있다면, 우리는 데이터를 얻기 위해 영패를 검증할 것입니다.그러나 오류가 발생하면 컨트롤러에 접근하는 것을 금지합니다.const authorization = (req, res, next) => {
const token = req.cookies.access_token;
if (!token) {
return res.sendStatus(403);
}
try {
const data = jwt.verify(token, "YOUR_SECRET_KEY");
// Almost done
} catch {
return res.sendStatus(403);
}
};
영패의 데이터에 더 쉽게 접근할 수 있도록 요청 대상에서 새로운 속성을 설명할 때가 되었다.이를 위해, 우리는req를 만들 것입니다.userId 및 토큰의 id 값을 할당합니다.우리는 또한 req를 만들 것이다.userRole 및 토큰에 존재하는 역할의 값을 지정합니다.컨트롤러에 권한을 주고
const authorization = (req, res, next) => {
const token = req.cookies.access_token;
if (!token) {
return res.sendStatus(403);
}
try {
const data = jwt.verify(token, "YOUR_SECRET_KEY");
req.userId = data.id;
req.userRole = data.role;
return next();
} catch {
return res.sendStatus(403);
}
};
이제 우리는 새로운 루트를 만들 것입니다. 이번에는 취소할 루트를 만들 것입니다.기본적으로 쿠키에서 이 값을 삭제합니다.즉, 우리는 jwt를 삭제할 것이다.그러나, 우리는 권한을 부여받은 중간부품을 우리의 새로운 루트에 추가하기를 희망합니다.사용자가 쿠키를 가지고 있으면 로그아웃하려고 하기 때문입니다.만약 사용자가 쿠키를 가지고 있다면, 우리는 그 값을 삭제하고, 사용자가 성공적으로 취소되었음을 알리는 메시지를 보낼 것입니다.
app.get("/logout", authorization, (req, res) => {
return res
.clearCookie("access_token")
.status(200)
.json({ message: "Successfully logged out 😏 🍀" });
});
이제 로그아웃할 수 있는지 테스트해 봅시다.그 목적은 첫 번째 로그아웃을 검증할 때 로그아웃에 성공했다는 메시지를 받을 것입니다.그러나 우리가 쿠키가 없는 상황에서 다시 테스트할 때 우리는 반드시 오류가 발생하여 쿠키가 금지되어 있음을 나타낼 것이다.이제 마지막 경로만 만들면 jwt에서 데이터를 얻을 수 있습니다.쿠키의 jwt에 접근할 수 있을 때만 이 경로를 접근할 수 있습니다.만약 우리가 이렇게 하지 않는다면, 우리는 잘못을 얻게 될 것이다.이제 요청에 추가된 새로운 속성을 이용할 수 있습니다.
app.get("/protected", authorization, (req, res) => {
return res.json({ user: { id: req.userId, role: req.userRole } });
});
만약 우리가 가장 좋아하는 고객에게 테스트를 한다면.우리는 먼저 전체 업무 흐름을 테스트할 것이다.다음 사항은 다음과 같습니다.최종 코드는 다음과 같아야 합니다.
const express = require("express");
const cookieParser = require("cookie-parser");
const jwt = require("jsonwebtoken");
const app = express();
app.use(cookieParser());
const authorization = (req, res, next) => {
const token = req.cookies.access_token;
if (!token) {
return res.sendStatus(403);
}
try {
const data = jwt.verify(token, "YOUR_SECRET_KEY");
req.userId = data.id;
req.userRole = data.role;
return next();
} catch {
return res.sendStatus(403);
}
};
app.get("/", (req, res) => {
return res.json({ message: "Hello World 🇵🇹 🤘" });
});
app.get("/login", (req, res) => {
const token = jwt.sign({ id: 7, role: "captain" }, "YOUR_SECRET_KEY");
return res
.cookie("access_token", token, {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
})
.status(200)
.json({ message: "Logged in successfully 😊 👌" });
});
app.get("/protected", authorization, (req, res) => {
return res.json({ user: { id: req.userId, role: req.userRole } });
});
app.get("/logout", authorization, (req, res) => {
return res
.clearCookie("access_token")
.status(200)
.json({ message: "Successfully logged out 😏 🍀" });
});
const start = (port) => {
try {
app.listen(port, () => {
console.log(`Api up and running at: http://localhost:${port}`);
});
} catch (error) {
console.error(error);
process.exit();
}
};
start(3333);
마지막 노트
분명히 이 예는 매우 간단하니, 나는 모두가 이 주제에 관한 문장을 좀 더 읽는 것을 건의한다.나는 내가 너를 도와 어떤 의문도 해결할 수 있기를 바란다.
그럼 너는?
이 인증 정책을 사용하거나 읽은 적이 있습니까?
Reference
이 문제에 관하여(노드에서 JWT가 있는 쿠키를 사용합니다.js), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/franciscomendes10866/using-cookies-with-jwt-in-node-js-8fn텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)