[Pet-Hub] 채팅방 퇴장시 Disconnect Header에 Authorization Header를 포함하지 못하는 문제 해결

DevSeoRex·2023년 6월 18일
4
post-thumbnail

🤔 발생한 문제

채팅방에서 회원이 퇴장하게 되면, Redis에서 회원의 정보를 삭제해줘야 합니다.
채팅방에서 회원이 퇴장할때 Redis에서 삭제되지 않게 되면, 채팅 상대방은 접속중이지 않지만 메시지는 읽음 처리되고 채팅 상대방에게 알람이 가지 않는 논리적오류가 발생하게됩니다.

채팅방 입장과 채팅방 퇴장은 토큰 검증에 대한 부분도 약간 다릅니다.
채팅방에 입장할때 유효하지 않은 AccessToken으로 입장을 시도한다면, 예외를 발생시키고 Stomp 연결을 하지 않게 처리하면 문제가 생기지 않습니다.

채팅방에 퇴장할때는 AccessToken이 유효한지 여부를 체크하지 않고, 채팅방에서 이탈한 회원을 반드시 Redis에서 삭제해줘야 안읽음 기능과 알람 기능이 제대로 동작합니다.

요구사항으로 정리하면, 회원이 채팅방에서 페이지 이동 또는 브라우저 종료를 통해 이탈한다면 AccessToken의 유효성과 관계 없이 Redis에서 삭제처리 해주어야 합니다.

🧑‍💻 어떻게 문제를 해결해야 할까?

첫 번째 시도

처음에는 프론트앤드에서 disconnect 함수에 Authorization 헤더를 포함시켜서 서버로 disconnect 요청을 보내보는 방법으로 개발을 진행했습니다.

AccessToken을 헤더에 포함시켰지만, 서버에 전달되지 않는 문제가 발생했습니다.
따라서 AccessToken을 헤더에 포함시키는 방법은 문제 해결에 도움이 되지 않는다는 것을 확인했습니다.

더 나아가서 생각해보면 AccessToken이 서버로 잘 도달했다고 하더라도, 채팅방에서 퇴장할때는 AccessToken이 유효한지 여부와는 상관없이 Redis에서 데이터를 반드시 삭제해줘야 논리적오류가 발생하지 않습니다.

두 번째 시도

프론트앤드에서 채팅방에서 페이지 이동 또는 브라우저를 종료할때 disconnect 함수를 호출해 연결을 끊고, 백엔드 API 서버로 채팅방의 번호와 회원의 이메일을 보내서 Redis에서 삭제하는 방법으로 수정을 해보았습니다.

이 방법으로 채팅방 퇴장이 잘 처리 되는지 확인해보겠습니다.


현재 채팅방에 입장하여, Redis에 회원정보가 저장되어 있는 것을 볼 수 있습니다.
브라우저를 종료하여 채팅방에서 이탈해보겠습니다.


정상적으로 Redis의 데이터가 사라진 걸 확인할 수 있습니다.

🤟 문제를 해결하며 느낀 점

처음 발생한 문제는, Stomp의 disconnect 함수에 Authorization Header를 포함시켰는데 서버에 도달하지 않아서 Header의 값을 사용하지 못하는 것이였습니다.

그 문제를 해결하려고 생각해보니, disconnect와 connect 할때 서버에서의 처리 방법과 기준이 달라져야 하는 것을 생각하지 못하고 같은 방법으로 문제에 접근한것이 더 큰 문제라는 것을 알게되었습니다.

Client가 서버에 요청을 보낼때, 데이터 정합성을 유지하고 논리적 오류를 방지할 수 있는 좋은 방법은 무엇일지 더 다양한 접근 방법으로 문제를 바라보아야 할 것 같다는 생각이 들게 되는 하루였습니다.

오늘도 읽어주셔서 감사합니다.

🙇

0개의 댓글