github-blog.png


⚒️ Refactoring


  • 민감정보 암호화 Task는 모두 끝냈다.

    다음 가져갈 Task로 로그아웃시 발생하는 에러 핸들링을 해보려한다.



문제점

  • 현재 로그인 방식은 cookie에 JWT Token을 담아 인증하는 방식으로 로그인검증이 이루어지고 있으며, 로그아웃시에는 로그인 여부를 검증한 뒤, 쿠키를 만료시키는 방식으로 로그아웃 처리를 구현하였다.

    controller/authentication/logout.js

    스크린샷, 2022-02-09 11-31-35

  • 로그아웃시 에러가 발생하는 대표적인 경우는 다음과 같다.

    • 웹이나 모바일 환경에서 강제로 쿠키를 삭제 후 로그아웃시 발생

      스크린샷, 2022-02-09 11-28-57

    우선 위의 크롬환경에서 쿠키를 강제로 삭제하는 경우 cookie에 담긴 JWT Token값이 날아가기 때문에, 로그인 검증이 이뤄지지 않아 발생하는 에러이다.

    스크린샷, 2022-02-09 11-24-50

  • 검색 결과 우선 에러의 원인은 “서버가 클라이언트에 둘 이상의 응답을 보내려고 할 때 발생하는 에러” 였다.



문제 해결


  • 우선 해결은 간단히 가능했다.

    키포인트는 “서버가 클라이언트에 둘 이상의 응답을 보내려고 할 때 발생하는 에러” 에러코드 그 자체가 정답이었다. (기계는 거짓말을 하지않는다…)

    우선 로그아웃시 userAuth 미들웨어 함수가 호출된다.

    // 로그인 인증검사
    await userAuth(req, res);
  • 해당 함수로 로그인 여부가 검증이 이뤄지며 미들웨어 함수의 자세한 내용은 아래와 같다.

    middlewares/authorized/userAuth.js

    스크린샷, 2022-02-09 11-42-11

  • 코드를 살펴보니 원인은 다음과 같았다.

    • 쿠키를 강제로 파괴하는 경우 client 상태는 로그인 상태이지만 JWT 토큰값이 없는 상황.

    • JWT 토큰이 없는 상황에서 userAuth 미들웨어 함수를 거치며 return값으로 401번 에러코드 json 응답 결과를 반환함.

    • 결국 로그아웃 API 요청이 들어왔을 경우 반환되는 json응답 결과값이 2개가 되어서 **“서버가 클라이언트에 둘 이상의 응답을 보내려고 할 때 발생하는 에러”**가 발생이 된다.

    controller/authentication/logout.js

    스크린샷, 2022-02-09 11-53-04

  • 우선은 로그인 인증검사 부분

    // 로그인 인증검사
    // await userAuth(req, res);
  • 해당 코드를 주석처리하면 에러는 발생하지 않는다.

    하지만, 조금더 나아가서 userAuth에서 로그인 검증 이후 accessToken값이 비어있다면 (즉, 유효하지 않은 로그인정보 상태라면) 메인페이지로 이동하고 로그인 모달을 띄워서 다시 로그인을 유도하는 방향으로 서버 & 클라이언트의 구조를 바꿔보아야 겠다. (내일 진행 예정)




  • 요청값에 일반적으로 1개의 응답결과를 반환해야하는 당연하고 기본적인 개념을 실수하고 넘어가서 발생한 에러였다.

  • 우선 해당 내용에 대해서 조금더 학습해보고 로그인 검증 이후 유효하지 않은 로그인 정보를 보유중이라면 메인페이지로 이동하고 로그인을 다시 유도하는 방향으로 전반적인 코드를 다시 작성해보아야겠다.