구현한 부분
- jwt 토큰으로 user 인증 및 user_id 사용
- jwt 에러 처리

임시로 user_id를 받아서 사용했으나 jwt 토큰인증으로 user_id를 체크할 수 있게됨.
헷갈렸던 부분
- 암호화는 crypto 모듈로 salt사용 - password
- jwt는 jsonwebtoken 모듈로 process.env.priavatekey 사용 - 사용자 id 확인 / 로그인된 사용자
jwt 과정
1. 로그인시 jwt를 발급(user_id정보 넣어서) 해준다.
2. 이 jwt를 가지고 api를 날릴 때 header의 authorization에 jwt token을 넣어서 보낸다.
3. process.env에 있는 privatekey로 payload 확인후 userid 사용
4. 만료기한 지나면 폐기됨.
jwt를 어디에 넣었나
서버 => 클라이언트: 쿠키
클라이언트 => 서버: 헤더
jwt 에러
- TokenExpiredError : 유효기간이 지난 토큰
- JsonWebTokenError : 문제가 있는 토큰 - 예) 인증되지 않음
토큰 발급 - 로그인시 : jwt.sign(내용, 비밀키, 만료기한 및 만든이)
const crypto = require("crypto"); //내장 암호화 모듈
const jwt = require("jsonwebtoken"); //jwt 모듈
const token = jwt.sign(
{
email: loginUser.email,
name: loginUser.name,
id: loginUser.id,
},
process.env.PRIVATE_KEY,
{
expiresIn: "15m",
issuer: "sungeun",
}
);
console.log(token);
res.cookie("token", token, {
httpOnly: true,
});
return res
.status(StatusCodes.OK)
.json({ message: `${loginUser.name}님 환영합니다.` });
jwt 디코딩 - jwt.verify(토큰 , 비밀키)
const jwt = require("jsonwebtoken");
let dotenv = require("dotenv");
dotenv.config();
const authorization = (req) => {
let token = req.headers["authorization"];
let decoded = jwt.verify(token, process.env.PRIVATE_KEY);
return decoded;
};
이후 payload에 id를 저장해두었다면 decoded.id로 사용 가능하다.
throw 연산자
에러를 발생시키는 연산자.
사용법 with jwt
const authorization = (req) => {
try {
let token = req.headers["authorization"];
let decoded = jwt.verify(token, process.env.PRIVATE_KEY);
console.log(decoded);
return decoded;
} catch (err) {
return err;
}
};
=> 디코딩 과정을 try - catch 문에 넣어서 수행하여 decode된 값 반환 or 문제발생시 err를 반환
let decoded = authorization(req);
if (decoded instanceof jwt.TokenExpiredError) {
return res
.status(StatusCodes.UNAUTHORIZED)
.json({ message: "로그인 세션이 만료되었습니다." });
} else if (decoded instanceof jwt.JsonWebTokenError) {
return res
.status(StatusCodes.BAD_REQUEST)
.json({ message: "잘못된 토큰입니다." });
} else {
//수행할 내용
}
=> 반환된 값이 err인 경우 케이스에 따른 에러처리
'타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) > TIL' 카테고리의 다른 글
데브코스 11주차 Day1 - 컴파일, 변수와 메모리영역 with C (3) | 2024.01.25 |
---|---|
데브코스 10주차 Day 1,2 - 페어코드, 마무리, 랜덤데이터 생성 api (0) | 2024.01.23 |
데브코스 9주차 Day 2,3,4 - [쇼핑몰]주문 controller, 비동기, promise (0) | 2024.01.12 |
데브코스 9주차 Day1 - [쇼핑몰]장바구니 controller , 중복 오류, ES6 문법 (0) | 2024.01.08 |
데브코스 8주차 Day4 - 좋아요 수/여부 조회(서브쿼리), 좋아요 기능 추가 (1) | 2024.01.07 |