반응형
jsonwebtoken이라는 라이브러리를 통해 node에서 jwt를 구현할 수 있다.
npm i jsonwebtoken
jwtMaker
const jwt = require('jsonwebtoken');
const jwtMaker = (id) => {
const payload = { id: id };
const secret = process.env.SECRET;
const options = {
expiresIn: '15m',
};
const token = jwt.sign(payload, secret, options);
return token;
};
module.exports = jwtMaker;
expiresIn을 통해 토큰의 만료시간을 설정해주었고, payload로 user_id를 기입해주었다.
user_id는 공개키로 언제든 복호화가 가능하므로 실제 id보다는 sequence number와 같이 테이블 조회용으로 사용가능하되, 외부에서는 사용불가능한 값으로 구성해주는게 좋다.
로그인 처리하기
...
if (id === reqId && pw === compareHash) {
const response = {
status: 200,
message: '로그인 성공',
data: {
access_token: jwtMaker(reqId),
},
};
res.json(response);
success = true;
}
});
if (!success) {
res.status(401).send('로그인 실패');
}
...
로그인이 성공했을때 jwt를 만들어서 응답으로 보내주자.
로그인시
프론트 코드를 다음과 같이 짜주었다.
...
const handleClick = async () => {
const body: ILoginPostBody = {
id,
pw: password,
};
try {
const response = await login(body);
if (response) {
const access_token = response.data.access_token;
console.log(access_token);
setAccess(access_token);
}
} catch (err: any) {
if (err.response.status === 401) alert('ID 또는 PW가 잘못되었습니다.');
}
};
...
이러면 로그인시 이렇게 access token이 확인된다
그럼 이 access token을 사용해서 mypage를 구현해보자.
JWT 인증하기
jwtAuth
const jwt = require('jsonwebtoken');
const jwtAuth = (token) => {
return jwt.verify(token, process.env.SECRET, (err, decoded) => {
if (err) {
throw err;
}
return decoded;
});
};
module.exports = jwtAuth;
jwt.verify를 통해 토큰의 유효성을 검증할 수 있다.
/mypage GET 분기
const express = require('express');
const router = express.Router();
const jwtAuth = require('../auth/jwtAuth');
const profile = require('../SQL/profile');
const verifyjwt = (req, res, next) => {
const token = req.headers.authorization;
if (!token) {
return res.status(401).json({ message: 'JWT가 필요합니다.' });
}
try {
const decoded = jwtAuth(token);
req.user = decoded.id;
next();
} catch (err) {
return res.status(401).json({ message: 'JWT가 유효하지 않습니다.' });
}
};
router.get('/', verifyjwt, async (req, res) => {
const [result] = await profile(req.user);
console.log(result);
res.status(200).json(result);
});
module.exports = router;
profile.js
const connectMySQL = require('./connect');
const profile = async (id) => {
const connect = await connectMySQL();
const SQL = `SELECT name, age from login_table where id='${id}'`;
const [row] = await connect.execute(SQL);
return row;
};
module.exports = profile;
토큰을 decoded해 얻은 id를 통해 쿼리문을 쳐서 프로필 정보를 가져와서 유저에게 보여주는 구조이다.
결과
반응형