인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김민규님의 프로필 이미지

작성한 질문수

따라하며 배우는 노드, 리액트 시리즈 - 기본 강의

노드 리액트 기초 강의 #14 로그아웃 기능

로그아웃 findOneAndUpdate 함수

작성

·

97

0

안녕하세요. 2024년도에 처음으로 Node.js를 학습해 보기 위해 해당 강의를 수강 중 입니다. 물론 Mongodb 관련(mongoose) callback 함수 등 변경점이 많아서 구글링과 인프런 질문 게시판을 활용하며 저만의 코드로 변경하는 중입니다. 그러던 중, token에 대한 궁금증이 생겨서 질문을 올립니다.

강의에서는 mongoose의 DB에 저장된 인스턴스를 찾은 후, 해당 인스턴스의 속성 값을 변경하는 findOneAndUpdate를 활용하려 하고 있습니다. 하지만, 저희는 기존에cookie에 x_auth라는 속성명으로 토큰값을 저장하고 있었습니다. 문서들을 찾아보니, 토큰 정보 등은 서버가 아닌 클라이언트가 저장하고 있는 것이 편리하기 때문에, DB의 보안성 때문에, DB 접근 시간보다 세션 또는 쿠키 접근이 빨라서 등 여러 이유가 있는 것 같습니다.

 

그렇다면, 저희가 만든 userSchema에서 token과 관련된 속성들의 존재 이유는 무엇인가요? 저희는 token을 login 과정에서도 cookie의 x_auth에 저장하고, db 갱신을 해주지는 않는데, 왜 굳이 logout 라우트에서는 findOneAndUpdate를 사용하는 것인가요? 그냥 쿠키의 x_auth 값을 비워주는 것은 안되는 것인가요??

긴 글 읽어주셔서 감사합니다.

답변 1

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 민규님.

Node.js와 Mongoose를 처음 학습하신다고 하니, 많은 부분이 생소하실 수 있습니다. 질문 주신 내용에 대해 답변 드리겠습니다.

클라이언트-서버 환경에서 토큰 인증을 관리하는 방법에는 여러 가지가 있으며, 일반적으로 다음과 같은 이유로 Mongoose를 통해 DB의 토큰 값을 수정합니다:

  1. 로그아웃 처리의 확실성: 클라이언트 쪽의 쿠키를 지우는 것으로 단순히 로그아웃을 처리하게 되면, 서버 루트에 클라이언트의 쿠키가 잘못 남아 있을 수 있는 위험이 있습니다. 이를 방지하기 위해 서버에서도 해당 사용자의 토큰을 확실히 삭제하는 게 좋습니다.

  2. 보안성 강화: 만약 사용자가 여러 디바이스에서 접속을 시도한 경우, 단순히 하나의 디바이스에서 쿠키를 지운다고 하더라도 다른 디바이스에서는 여전히 접근할 수 있는 위험이 있습니다. 서버 DB의 토큰을 지우는 것은 모든 세션을 종료시키는 것을 의미하므로, 보안 측면에서 효과적입니다.

  3. 서버-클라이언트 타협: 최적의 보안을 유지하면서 클라이언트의 데이터를 통제 및 관리하기 위한 방법으로 사용될 수 있습니다. 로그인 세션 관리를 DB와 쿠키 모두를 활용함으로써 잠재적인 보안 위협을 줄이고, 데이터의 일관성을 유지할 수 있습니다.

마지막으로 이 게시글에 유사한 문제를 해결하는 방법이 논의되었습니다. findOneAndUpdate 함수를 사용할 때, 이전에는 Mongoose에서 콜백을 지원했지만 현재는 Promise 또는 Async/Await로 활용해야 하는 부분이 변경되었습니다. 여기서도 req.user._idundefined로 나오는 경우가 동일하게 논의되었으며, 미들웨어(auth)에서 해당 값을 제대로 넣는지를 꼭 확인하셔야 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.