cookie 적용하기
지난 포스팅에서 언급했다시피 뭅스터는 유저 인정 토큰을 client-쿠키 server-redis에 저장할 것이다.
그러면 쿠키를 어떻게 저장하고 삭제하는지 알아보자.
1. express 내장 cookie 사용하기
cookie-parser 라이브러리를 활용하지 않고 express 내장 cookie 를 활용할 수 있다.
지난 프로젝트인 ‘으랏챠피디아’에서 해당 방법으로 개발하였는데, 으랏챠 피디아의 코드를 살펴보자.
서버에서 클라이언트로 쿠키 전송
res
.cookie('access_token', token, { expires: ACCESS_TOKEN_EXPIRED, httpOnly: true })
.status(200)
.json(
resData.successTrue(resMessage.SIGNUP_SUCCESS, {
isAuth: true,
email: signupUser.email,
username: signupUser.username,
})
);
다음과 같이 response시에 cookie로 (key, value, option)
으로 전송한다.(cookie는 kye-value 속성이다.)
option으로 만료기한과 httpOnly를 주었는데, 만료 기한은 쿠키만의 강력한 장점이므로, 만료기한을 설정해주자.
또한 httpOnly 속성도 보안을 위해 필수로 주어야 한다.✨
그럼 해당 api 를 응답받은 클라이언트의 쿠키에 access_token 값으로 token이 잘 들어간다!
클라이언트에서 서버로 쿠키 전송
클라이언트에서는 A라는 서버에서 쿠키를 받았으면, 그 후에 A라는 서버에 api 요청을 할 때,
별도 처리를 하지 않더라도 사전에 받은 쿠키를 전송한다. (정확히는 domain이다.)
때문에 클라이언트에서는 서버로 쿠키를 전송하기 위해 처리할 작업이 없다!
서버에서 클라이언트가 보낸 쿠키 값 확인
const token = req.headers.cookie?.split('access_token=')[1];
쿠키는 header에 저장되어 오기 때문에 다음과 같이 req.headers.cookie로 가져오면 된다.
옵셔널 체이닝은 쿠키가 없을 때의 에러핸들링 처리를 위해 추가하였고,
한 도메인에서 여러 쿠키를 줬을 때를 대비하여, key 값인 access_token= 으로 값을 구한다.
(참고로 헤더에는 쿠키가 key=value로 들어온다.)
서버에서 클라이언트의 쿠키 삭제
쿠키는 서버에서 만들고 서버에서 삭제한다!✨✨
(클라이언트에서 쿠키를 삭제할 수 있지만, 절대적으로 지양하는 방법이다)
res.clearCookie('access_token').status(200).json(resData.successTrue(resMessage.LOGOUT_SUCCESS));
response시, clearCookie(key) 를 내려주면, 해당 api를 요청한 클라이언트의 쿠키의 key 값이 사라진다.
2. cookie-parser 사용하기
위의 방식대로 express 내장 쿠키를 사용해도 되지만 cookie-parser 라이브러리를 사용하면 더욱 간편하게 쿠키를 다룰 수 있다. (보안 문제도 내부적으로 처리해준다.)
cookie-parser 설치 및 세팅
npm install --save cookie-parser
해당 명령어를 통해 cookie-parser 를 설치하자.
index.js
const cookieParser = require('cookie-parser');
app.use(cookieParser())
express에게 해당 라이브러리를 알려주고 미들웨어로 등록해주자.
서버에서 클라이언트로 쿠키 전송
return res
.status(CODE.OK)
.cookie('accessToken', result.token.accessToken, { httpOnly: true })
.cookie('refreshToken', result.token.refreshToken, { httpOnly: true })
.json(form.success(result.admin));
서버에서 클라이언트가 보낸 쿠키 값 확인
if (!req.cookies.accessToken) {
return res.status(CODE.UNAUTHORIZED).json(form.fail(MSG.UNAUTHORIZED));
}
cookie-parser를 사용하면, req.cookies 를 통해 쿠키 값을 확인 할 수 있다.
서버에서 클라이언트의 쿠키 삭제
res.clearCookie('accessToken').clearCookie('refreshToken').status(CODE.OK).json(form.success(MSG.LOGOUT_SUCCESS));