JWT 설정
유효 기간과 발행자 설정
토큰을 발행하는 sign 메서드의 마지막 인자에는 토큰의 설정을 적는다.
토큰의 유효 기간은 expiresIn이며, 초 단위의 숫자 또는 기간을 나타내는 문자열이어야 한다. 문자열로 작성할 때는 '1d', '1h', '30m'과 같이 작성하면 된다.
issuer은 토큰의 발행자를 적는다.
const token = jwt.sign({
email: loginUser.email,
name: loginUser.name
}, process.env.PRIVATE_KEY, {
expiresIn: '30m',
issuer: 'ncherryu'
});
아래 사진은 발행한 토큰을 복호화한 결과다. Payload에서 exp는 토큰의 유효 기간, iss는 토큰의 발행자를 의미한다.
cookie 설정
발행한 jwt는 쿠키에 써야 한다. 따라서 응답을 보내기 전에 응답의 쿠키에 토큰을 저장한다.
쿠키는 키-값 쌍으로 저장하기 때문에 첫 번째 파라미터는 키, 두 번째 파라미터에는 문자열 값을 써주면 된다.
res.cookie('token', token);
아래 사진처럼 로그인을 시도해보면 Cookies에 토큰이 저장되어 있는 것을 확인할 수 있다.
httpOnly
API 호출만을 허락하는 기능이다.
false로 설정하면 프론트엔드(화면)단에 XSS와 같은 공격이 들어오면 쿠키도 공격 대상이 될 수 있다.
true로 하면 http api로만 요청을 받을 때만 쿠키에 접근 가능하게 된다.
설정을 true로 바꿔보자.
cookie의 세 번째 파라미터로 옵션을 넣어줄 수 있다. 여기에서 httpOnly를 true로 설정한다.
res.cookie('token', token, {
httpOnly: true
});
로그인 실패 상태코드
전달받은 아이디와 비밀번호 값은 유효하지만 비밀번호가 일치하지 않거나 존재하지 않는 아이디인 경우 권한이 없다는 403 상태 코드를 응답으로 보내야 한다.
router.post(
'/login',
[
body('email').notEmpty().isEmail().withMessage('이메일 확인 필요'),
body('password').notEmpty().isString().withMessage('비밀번호 확인 필요'),
validate
],
(req, res) => {
// ...
if (loginUser && loginUser.password === password) {
// token 발행
const token = jwt.sign({
email: loginUser.email,
name: loginUser.name
}, process.env.PRIVATE_KEY, {
expiresIn: '30m', // payload에 exp 항목과 iss 항목이 생김. 토큰 유효 기간과 발행자를 의미
issuer: 'ncherryu'
});
res.cookie('token', token, {
httpOnly: true
});
res.status(200).json({
message: `${loginUser.name}님, 로그인 되었습니다.`,
});
} else {
res.status(403).json({
message: '이메일 또는 비밀번호가 틀렸습니다.'
});
}
}
);
})
'데브코스' 카테고리의 다른 글
[6주차 - DAY5] 도서 정보 API 설계 (0) | 2024.04.05 |
---|---|
[6주차 복습 발표] JWT를 이용한 인증 및 인가 (0) | 2024.04.04 |
[6주차 - DAY3] JWT를 이용한 인증 및 인가 (0) | 2024.04.03 |
[6주차 - DAY2] 유효성 검사 (1) | 2024.04.02 |
[6주차 - DAY1] RESTful API 개발 실습 (0) | 2024.04.01 |