오늘은 Node.js 숙련주차 시작으로, 쿠키-세션, JWT를 이용한 사용자 정보 인증을 하는 코드 구현을 공부했다.
오늘 공부를 하면서 궁금했던 점과 silly mistake으로 인한 에러를 공유한다.
궁금한 것
AccessToken(A.T.)이 만료되어, 클라에서 RefreshToken(R.T.)만 http 헤더에 실어 서버에 요청을 보낸 경우라고 가정.
현재 강의에서 배운 코드를 보면, R.T.을 이용해서 A.T.을 재발급을 받고 새 A.T.를 클라로 response함.
이후, 클라에서 새로 받은 A.T.를 가지고 request를 날려야 해당 토큰 payload를 디코드해 id validation을 수행함.
그런데, 실제로는 이런 경우에, front에서 새로 받은 토큰을 가지고 자동으로 서버에 validation 요청을 다시 날리도록 하는지?? 아니면, 서버에서 알아서 처리하는지??
app.get("/get-token", async (req, res) => {
const { accessToken, refreshToken } = req.cookies;
//토큰 유무 확인
if (!refreshToken)
return res
.status(400)
.json({ message: "Refresh Token이 존재하지 않습니다." });
if (!accessToken)
return res
.status(400)
.json({ message: "Access Token이 존재하지 않습니다." });
//토큰이 있으면 각각 validation check
const isAccessTokenValidate = validateAccessToken(accessToken);
const isRefreshTokenValidate = validateRefreshToken(refreshToken);
//RefreshToken이 만료된 상태면 재로그인이 필요함
if (!isRefreshTokenValidate)
return res.status(419).json({ message: "Refresh Token이 만료되었습니다." });
//AccessToken이 만료된 상태면, RefreshToken을 사용해 재발급
if (!isAccessTokenValidate) {
const accessTokenId = tokenObject[refreshToken];
if (!accessTokenId)
return res
.status(419)
.json({ message: "Access Token이 만료되었습니다." });
// AccessToken을 새로 발급하고 res를 return 해버림 => 이후 클라에서 다시 한번 요청을 해야 아래 payload를 가지고 id 인증 절차를 진행
const newAccessToken = createAccessToken(accessTokenId);
res.cookie("accessToken", newAccessToken);
return res.json({
message: `${id}의 Payload를 가진 Token이 성공적으로 인증되었습니다.`,
});
}
const { id } = getAccessTokenPayload(accessToken);
return res.json({
message: `${id}의 payload를 가진 Token이 성공적으로 인증되었습니다.`,
});
});
이 문제는 내일 공부하면서 스스로 해결해보거나, 안되면 저녁에 기술 매니저님께 여쭤본 후 업데이트 할 예정이다.=> 해결 완료!! (20221203)
Refresh Token 동작 시나리오
1. 클라에서 ID, Pw로 서버에 인증을 요청하면, 서버는 이를 확인하고 Access Token과 Refresh Token을 발급
2. 클라는 Refresh Token을 local에 저장하고, Access Token으로 서버와 통신
3. 서버는 통신 중 Access Token이 만료된 것을 확인하면, 더 이상 사용할 수 없다는 오류를 클라로 전달
4. 클라는 local에 저장해놨던 Refresh token을 서버로 날려 새로 Access Token을 발급해 줄것을 요청
5. 서버는 Refresh Token을 받아 서버 Storage에서 해당 토큰 정보가 유효한지 확인하고, 유효하면 Access Token을 새로 발급하여 클라로 전송
6. 2번부터 반복
- jiwonkwon97님의 블로그
오늘 만난 에러
내가 node.js를 사용해서 열어주려고 한 port가 이미 사용 중이라는 에러 메세지였다.
PS C:\~~\prac> node .\jwt-prac.js
3001 포트로 서버가 열렸어요!
node:events:504
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE: address already in use :::3001
Emitted 'error' event on Server instance at:
at emitErrorNT (node:net:1357:8)
at processTicksAndRejections (node:internal/process/task_queues:83:21) {
code: 'EADDRINUSE',
errno: -4091,
syscall: 'listen',
address: '::',
port: 3001
}
인터넷을 뒤져서 해당 포트로 열려 있는 프로그램을 강제 종료시키려고 하였다.
나는 윈도우 pc를 사용 중이라 아래와 같이 netstat 명령어를 사용했다.
netstat -ano | findstr 3001 //해당 포트넘버를 이용하고 있는 앱의 PID를 찾아서 ex)12345
taskkill /pid 12345 // 죽인다
그런데, 아무리 봐도 3001번 포트로 열려 있는게 없었다.
다시 위의 에러 메세지로 돌아가 보니, 3001번 포트로 서버가 열렸다가 바로 에러가 났던 것이었다.
코드를 훑다보니, api 코드 한 가운데 app.listen()이 끼어 있었다..;;
그리고 같은 포트번호를 매개변수로 갖는 app.listen()이 코드 끝에 한번 더 있어서, 서버가 켜지자 마자 바로 죽었던 것!
중간에 끼인 app.listen() 블럭을 삭제하니 제대로 잘 돌아갔다..ㅎㅎㅎ
'항해99_10기 > 105일의 TIL & WIL' 카테고리의 다른 글
| [3주차 WIL] 2022.11.28 ~ 2022.12.03 회고 (0) | 2022.12.04 |
|---|---|
| [4주차][20221203] node.js에서 mySQL을 사용하기 위해 알아야 하는 것들 : Sequelize, Migration, Model (0) | 2022.12.04 |
| [3주차] [20221201] Routing (1) | 2022.12.01 |
| [3주차] [20221201] IP 주소와 port, 그리고 DNS (0) | 2022.12.01 |
| [3주차] [20221130] MongoDB 스키마 설계 (0) | 2022.11.30 |