개발자

웹 백엔드) Bcrypt를 이용하여 암호화 시 비밀번호 검증

2024년 01월 17일조회 83

사용중인 라이브러리: Express.js bcrypt mongoose 현재 진행중인 사내 웹 프로젝트내에 게시판을 만들려고 하는데 DC인사이드 처럼 게시글마다 비밀번호를 설정하도록 기능구현을 한 상태입니다. 비밀번호는 bcrypt를 이용해서 암호화를 진행했고 수정이나 삭제를 할 땐 비밀번호 검증 후 수정/삭제가 이뤄지도록 구현하고 있습니다. 패스워드가 bcrypt로 암호화되어 있기 때문에 수정의 경우 1. request body에 비밀번호를 보내서 백엔드에서 bcrypt.compare() 2. 비밀번호가 일치할 시 해당 게시글의 데이터를 response 3. response에서 받은 데이터를 기반으로 프론트 수정페이지에 보여준다음 4. 수정페이지 내용을 다시 PUT요청으로 수정하도록 구현되어 있습니다. 이 과정에서 API가 1. 비밀번호 검증용(GET) 2. 게시글 수정용(PUT) 이렇게 두가지가 필요한 상황이 되었는데, 비밀번호 검증 GET에서 질문이 생겼습니다. 기본적으로 GET과 DELETE요청은 request body를 가지지 않는게 규칙이라고 배웠습니다. 하지만 request body를 가지는 POST와 PUT은 그 의미가 생성/수정이라고 이해하고 있습니다. 그렇다고 비밀번호를 URL에 Query Params로 보내자니 보안상 문제가 되지않을까 걱정이 되구요... 1. GET 또는 DELETE요청에 request body를 포함하여 보낸다. - 현재 사용중인 방식이고 앞서 말한 규칙 때문에 수정을 고민중이며 구현, 사용상에 문제는 없었습니다. 2. POST 또는 PUT요청에 request body를 포함하여 보낸다. - 현재 고려중인 방식이고 의미적인 문제가 없다면 이렇게 사용하려고 합니다. 개발 자체를 공부해본지 얼마안된 개발어린이라 제 상식외의 문제가 발생하면 대처하기가 어렵네요..ㅜㅜ 위에 제시한 1, 2번 방법중 어떤게 더 Best Practice에 가까울까요? 더 좋은 방법이 있다면 의견도 제시해주시면 너무 감사하겠습니다. <(__)>

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 3

인기 답변

김도열님의 프로필 사진

그런 목적으로 패스워드를 미리 검증해 보는 API가 필요하셨군요. 그런 경우 API를 통해서 하는 작업은.. DB에 저장된 패스워드를 프론트엔드로 전달한다는 의미에서의 "조회"가 아니기 때문에 GET 메서드를 사용하지 않습니다. API가 하는 동작은 프론트엔드에서 요청에 실어 보낸 비밀번호가 맞는 것인지 검증하고 검증 결과를 돌려 주는 것인데, API 이름에 동사를 사용하지 않는 것이 관례이기 때문에 적절한 명사 + 메서드의 조합을 생각해야 합니다. 한 가지 제안을 드린다면, "패스워드 검증" 이라는 리소스 (또는 컬렉션)을 POST 한다고 볼 수 있습니다. 예를 들면 (POST) /api/v1/password-verifications 어떤 선택을 하시던지 아래 두 가지는 지키는 것이 좋겠습니다. 1. 비밀번호 검증 API가 별도로 있다 하더라도, 게시글 수정 API 역시 비밀번호를 검증하는 기능을 가지고 있어야 한다. 2. 비밀번호를 querystring으로 전송하지 않는다.

정득광님의 프로필 사진

정득광

작성자

없음 비전공2024년 01월 17일

조언 감사합니다! 참고해서 구성하도록 하겠습니다 ㅎㅎ

인기 답변

김도열님의 프로필 사진

API를 둘로 나누셨는데, 그렇다면 프론트엔드가 비밀번호 검증을 요청하고 OK 응답을 받았을 때 게시글 수정 API를 호출한다는 말씀이신가요? 이런 구조라면 직접 게시글 수정 API를 호출했을 때 비밀번호 검증 없이 수정이 되는 것을 막지 못하겠죠. 따라서 비밀번호 검증과 같은 것은 별도의 API로 만들지 않습니다. 비밀번호 검증 로직을 재활용 하는 것은 서비스 레이어에서 하면 되고, 별도의 컨트롤러는 좋은 선택 같지 않습니다. 결론 : PUT 메서드를 사용하는 게시글 수정 API의 Body에 비밀번호를 포함 시킨다.

정득광님의 프로필 사진

정득광

작성자

없음 비전공2024년 01월 17일

원래 제일 처음엔 게시글 수정 API의 Body에 비밀번호를 포함시켰는데, 이렇게 하니 수정페이지까지 누구나 넘어갈 수 있고 수정버튼을 눌렀을때 수정이 되냐/안되냐 로 나뉘게 되더라구요.. 이런게 혹시나 사용경험의 측면에서 불편으로 느껴질까봐 둘로 나누었던 것이었습니다. 조언해주신 방식을 공부해보고 수정하도록 하겠습니다! 감사합니다 ㅎㅎ

백승훈님의 프로필 사진

답변 주신 분의 내용이 가장 베스트일것 같긴 한대 사전에 미리 파악하는 API가 필요하다면 GET을 사용하지 않고 POST를 사용하는 게 맞습니다. 일반적으로 POST는 서버 상태의 변경을 유발하는 경우에 사용되지만, 이는 서버의 데이터베이스에 새로운 내용이 추가되거나 변경되는 경우에만 해당되는 것은 아닙니다. 인증과 같은 경우에도 POST를 사용하는 것이 일반적입니다. 이는 POST 요청이 GET에 비해 더 안전하기 때문입니다. 보통 로그인 등을 처리할 때도 Get이 아닌 Post를 사용합니다. 비슷한 맥략으로 사용하시면 될 것 같습니다.

정득광님의 프로필 사진

정득광

작성자

없음 비전공2024년 01월 17일

부족한 지식에 보탬이 되주셔서 감사합니다 ㅎㅎ! 답변 내용 참고하도록 하겠습니다!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!