Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- AntDesign
- DatePicker
- map이 undefined가 뜰 때
- DataGridView 직접 입력
- Replication
- pm2
- allow_anonymouse
- pm2 확인
- pm2 설치
- setInterval clear
- 서버동기화
- transfer
- c# datagridview 데이터 넣기
- invalid data
- pm2 시작
- timepicker
- mosquitto.conf
- 데이터테이블 데이터 넣기
- datagridview 직접입력
- pm2 상태 확인
- mosquitto
- setInterval 정지
- 1883
- listener 1883
- setInterval 외부 정지
- 공인IP
- mySQL_Replication
- html #select #option #multiple
- setInterval 중지
- 맥 어드레스
Archives
- Today
- Total
개발 노트
내가 사용한 JWT 본문
//로그인. 첫 로그인 버튼클릭
router.post('/login/IDPW', (req, res) => {
const userId = req.body.userId;
const userPw = req.body.userPw;
db.query(
`SELECT
(SELECT devVal FROM dw_device_config WHERE devName='Farm_web_ID' LIMIT 1) farmWebId,
(SELECT devVal FROM dw_device_config WHERE devName='Farm_Web_Code' LIMIT 1) farmCode`,
(err, result) => {
if (err) {
log(err);
} else {
if (userId === result[0].farmWebId && userPw === result[0].farmCode) {
const id = userId;
const pw = userPw;
const accessToken = jwt.sign({ id }, 'jwtSecret', {
expiresIn: '1h',
});
const refreshToken = jwt.sign({ id }, 'jwtSecret', {
expiresIn: '12h',
});
res.send({ result: 'SUCCESS', accessToken, refreshToken });
} else {
res.send({ result: 'FAIL' });
}
}
},
);
});
token값을 줄 때 sign으로 토큰을 정의하며 ({헤더값},내용(playload),옵션(파기시간))을 주는 식으로 간단하게 토큰을 만들어서 적용을 했다.
토큰을 사용함에 있어서 어려웠던 것은 미들웨어와 axios.interceptor이다.
const log = require('../../logger');
const router = require('express').Router();
const db = require('../../utils/db');
const fs = require('fs');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcrypt');
//로그인. 미들웨어
log('login');
exports.jwtMiddleware = async (req, res, next) => {
try {
//토큰 가져오기, 비밀번호 할당
const token = req.headers.accesstoken;
let jwt_secret = 'jwtSecret';
//검증단계
req.decoded = jwt.verify(token, jwt_secret);
return next();
} catch (err) {
console.log('err :>> ', err);
if (err.name == 'TokenExpiredError') {
return res.status(403).json({ success: false, message: 'token 만료' });
}
return res
.status(401)
.json({ success: false, message: 'token이 유효하지 않습니다.' });
}
};
위는 내가 만들어서 사용한 미들웨어인데 간단하게 jwt,verify로 인증하고 err를 체크하는 형식으로 진행했다.
await request
.post('login/IDPW', {
userId: userId,
userPw: userPw,
})
.then((res) => {
const accessToken = res.data.accessToken;
const refreshToken = res.data.refreshToken;
localStorage.setItem(
'user',
JSON.stringify({ accessToken, refreshToken })
);
// API 요청하는 콜마다 헤더에 accessToken 담아 보내도록 설정
request.interceptors.request.use(
function (config) {
const user = localStorage.getItem('user');
if (!user) {
config.headers['accessToken'] = null;
config.headers['refreshToken'] = null;
return config;
}
const { accessToken, refreshToken } = JSON.parse(user);
config.headers['accessToken'] = accessToken;
config.headers['refreshToken'] = refreshToken;
return config;
},
function (error) {
console.log(error);
return Promise.reject(error);
}
);
request.interceptors.response.use(
(response) => {
console.log('111', 111);
return response;
},
async (error) => {
console.log('2222 :>> ', 2222);
if (error.response.request.status === 403) {
try {
console.log('error403 :>> ', error);
const originalRequest = error.config;
const data = await request.get('/login/refresh');
console.log('data :>> ', data);
if (data) {
const { accessToken, refreshToken } = data.data;
originalRequest.headers.accessToken = accessToken;
originalRequest.headers.refreshToken = refreshToken;
localStorage.removeItem('user');
localStorage.setItem(
'user',
JSON.stringify({ accessToken, refreshToken })
);
return await request.request(originalRequest);
} else {
navigate('/Login');
}
} catch (error) {
localStorage.removeItem('user');
console.log(error);
navigate('/Login');
}
return Promise.reject(error);
}
return Promise.reject(error);
}
);
request.defaults.headers.common[
'Authorization'
] = `Bearer ${accessToken}`;
})
.catch((error) => {
console.log(error);
});
let preData = [];
preData.push({ ID: userId });
preData.push({ PW: userPw });
let data = JSON.stringify(preData);
message.success('통과');
navigate('/');
//똑같다면 포스트 아니라면 error ~~가 다릅니다.
};
위의 코드는 인증을 진행하는 axios코드인데 requst가 axios라고 보면 된다.
로그인시에 인터셉터를 심어놔서 모든 미들웨어잡업시에 인터셉터가 일을 하게 된다. (처음 안 정보)
하지만 새로고침을 하면 로그인 버튼 클릭시에만 작동을 하게 짜놨는데 클릭을 안해서 인터셉터가 안 심어지는 바람에 버그가 일어났다.
그래서 처음 시작할 때 최 상단 컴포넌트에서 인터셉터 response만 심어놓도록 작업을 해놓았는데 이게 좋은 방법일지는 의문이다.
오늘 찾은 블로그인데 참고해서 확실하게 공부를 해놔야겠다.
'React' 카테고리의 다른 글
map이 undefined가 뜰 때 밑 useEffect에서 한번에 값을 못가져와서 undefined가 뜰 때 (0) | 2023.02.08 |
---|---|
React - 지역변수 및 렌더링 (0) | 2023.02.07 |
React - 특정시간과 현제시간 사이의 차이 구하기 (0) | 2023.01.25 |
React 로그인2 - Firebase 서비스 이용(토큰) (0) | 2023.01.24 |
React 로그인 1 - 세션을 이용한 로그인 인증 (0) | 2023.01.24 |