ALL-CON Refactoring 3일차 - 하나의 요청에 두개 이상의 응답시 발생하는 에러 핸들링
⚒️ Refactoring
-
민감정보 암호화 Task는 모두 끝냈다.
다음 가져갈 Task로 로그아웃시 발생하는 에러 핸들링을 해보려한다.
문제점
-
현재 로그인 방식은
cookie
에 JWT Token을 담아 인증하는 방식으로 로그인검증이 이루어지고 있으며, 로그아웃시에는 로그인 여부를 검증한 뒤, 쿠키를 만료시키는 방식으로 로그아웃 처리를 구현하였다.controller/authentication/logout.js
-
로그아웃시 에러가 발생하는 대표적인 경우는 다음과 같다.
-
웹이나 모바일 환경에서 강제로 쿠키를 삭제 후 로그아웃시 발생
우선 위의 크롬환경에서 쿠키를 강제로 삭제하는 경우
cookie
에 담긴 JWT Token값이 날아가기 때문에, 로그인 검증이 이뤄지지 않아 발생하는 에러이다. -
-
검색 결과 우선 에러의 원인은 “서버가 클라이언트에 둘 이상의 응답을 보내려고 할 때 발생하는 에러” 였다.
문제 해결
-
우선 해결은 간단히 가능했다.
키포인트는 “서버가 클라이언트에 둘 이상의 응답을 보내려고 할 때 발생하는 에러” 에러코드 그 자체가 정답이었다.
(기계는 거짓말을 하지않는다…)우선 로그아웃시
userAuth
미들웨어 함수가 호출된다.// 로그인 인증검사 await userAuth(req, res);
-
해당 함수로 로그인 여부가 검증이 이뤄지며 미들웨어 함수의 자세한 내용은 아래와 같다.
middlewares/authorized/userAuth.js
-
코드를 살펴보니 원인은 다음과 같았다.
-
쿠키를 강제로 파괴하는 경우
client
상태는 로그인 상태이지만 JWT 토큰값이 없는 상황. -
JWT 토큰이 없는 상황에서
userAuth
미들웨어 함수를 거치며return
값으로 401번 에러코드json
응답 결과를 반환함. -
결국 로그아웃 API 요청이 들어왔을 경우 반환되는
json
응답 결과값이 2개가 되어서 **“서버가 클라이언트에 둘 이상의 응답을 보내려고 할 때 발생하는 에러”**가 발생이 된다.
controller/authentication/logout.js
-
-
우선은 로그인 인증검사 부분
// 로그인 인증검사 // await userAuth(req, res);
-
해당 코드를 주석처리하면 에러는 발생하지 않는다.
하지만, 조금더 나아가서
userAuth
에서 로그인 검증 이후accessToken
값이 비어있다면 (즉, 유효하지 않은 로그인정보 상태라면) 메인페이지로 이동하고 로그인 모달을 띄워서 다시 로그인을 유도하는 방향으로 서버 & 클라이언트의 구조를 바꿔보아야 겠다.(내일 진행 예정)
-
요청값에 일반적으로 1개의 응답결과를 반환해야하는 당연하고 기본적인 개념을 실수하고 넘어가서 발생한 에러였다.
-
우선 해당 내용에 대해서 조금더 학습해보고 로그인 검증 이후 유효하지 않은 로그인 정보를 보유중이라면 메인페이지로 이동하고 로그인을 다시 유도하는 방향으로 전반적인 코드를 다시 작성해보아야겠다.