return res.status(400).json({ accessToekn: await new jose.SignJWT({ user_id: user.id }) .setProtectedHeader({ alg: "HS256" }) .setIssuedAt() .setExpirationTime("1h") .sign(secret), }); });retun res 문을 통해 토큰에 필요한 옵션을 지정하고 생성
결과 : 
토큰 생성 확인
import * as jose from "jose"; import { secret } from "../core/auth.js"; export default async function (req, res, next) { const authHeader = req.headers.authorization; try { const token = authHeader.split(" ")[1]; await jose.jwtVerify(token, secret); console.log(verfiedToken); } catch (error) { return res.status(401).json({ message: "토큰 인증에 실패했습니다.", }); } next(); }

토큰 넘겨주기로 인증 성공(Authorization 사용 시 소문자로 쓸 것)
router.patch("/:userId", authMiddleware, (req, res) => { const { userId } = req.params; const userIndex = db.data.users.findIndex(({ id }) => id === userId); if (userIndex < 0) { return res.status(404).json({ _links: { users: { href: req.baseUrl, }, }, messaage: "조회하려는 유저가 존재하지 않습니다", error: "Not Found", }); } if (req.auth.user_id !== userId) { return res.status(403).json({ message: "올바르지 않은 접근입니다.", }); } const { error, value } = userPartialUpdateSchema.validate(req.body); if (error) { return res.status(400).json({ messaage: error.details[0].message, }); } const user = db.data.users[userIndex]; for (const key of Object.keys(req.body)) { user[key] = value[key]; } db.data.users[userIndex] = user; db.write(); const { value: userResponseData } = userResponseSchema.validate(user, { stripUnknown: true, }); res.status(200).json({ _embedded: { user: { links: { self: { href: `${req.originalUrl}`, }, }, ...userResponseData, }, }, }); });
토큰 내부의 데이터를 가져와 해당 데이터를 요청과 검증함으로써 해당 토큰을 가진 유저가 올바르게 접근했는지 확인한다.
