저번에 로그인까지 만들었는데, 그 이후 로그인 유저는 글쓰기와 댓글쓰기를 비밀번호 입력 없이 가능하도록 수정해야 했다. 이 과정에서 많은 수행착오가 있었고, 결국 보안상 별로 좋지는 못하지만 기능을 구현하는데는 성공하긴 했다.
글쓰기
먼저 로그인 유저의 경우 글쓰기를 할 시 닉네임이 수정 불가능이어야 하고, 글 삭제, 수정을 위한 비밀번호 입력이 없어야 한다.
이를 위해 write.ejs에서 로그인 정보가 없을 경우만 비밀번호 입력란을 생성하도록 하였다. 물론 view.js에서 세션의 로그인 정보를 페이지 렌더링 전에 넘겨준다. 닉네임 입력란 같은 경우 수정 불가능하도록 바꿨다. 로그인 유저의 경우 글의 password 칼럼은 유저의 고유 id 값을 암호화하여 저장하였다.
글조회
글 조회의 경우 비로그인 유저가 쓴 글은 로그인 유저가 조회하든, 비로그인 유저가 조회하든 수정,삭제의 여지가 있으므로 버튼을 표시하고, 로그인 유저가 쓴 글은 조회자가 로그인 유저이며, 해당 글을 쓴 사람에게만 수정, 삭제 버튼을 노출하도록 했다.
수정 같은 경우 다른 페이지로 이동해야 하기 때문에 구조상 자바스크립트 내에서 form을 만들어서 전송했다. 해당 유저가 진짜 맞는지 확인하기 위해 해당 요청을 넣은 세션의 id값과 저장된 password 값이 같은지 내부적으로 확인한다.
댓글쓰기
댓글쓰기는 로그인 유저의 경우 닉네임을 수정할 수 없고, 패스워드 입력란을 비활성화시켰다. 또한 로그인 유저가 쓴 댓글은 해당 유저로 로그인한게 아니라면 삭제를 위한 X 버튼도 노출되지 않도록 했다.
이 부분은 코드가 너무 길어서 생략한다. (깃허브에 다 있다)
여기서 보안상 문제가 있다. 로그인 유저가 자신의 댓글을 삭제하는 메서드는 deleteMyReply(), 비로그인 유저가 비밀번호를 입력하고 댓글을 삭제하는 메서드는 deleteReply() 인데, 만약 로그인 유저가 개발자 도구 등을 이용해 다른 댓글의 함수명을 바꾸고 실행해버린다면 엉뚱한 댓글이 삭제될 수 있다. 댓글 삭제 기능을 처음 만들때부터 발생할 수 있었던 문제인데... 설계 미스다. 이 부분은 후에 코드를 통째로 수정해야 할 것 같다.
어찌되었든 로그인 기능까지 얼추 구현을 다 마친 것 같다. 이 시점에서 좀 문제점을 짚어보자면,
- 댓글 삭제 기능의 보안상 이슈
- 쿼리를 처리하는 부분(db-query.js)의 난잡함. 오류 코드 등 모두 제각각이고 디버깅하기 매우 힘듦
- 주석이 거의 전무함에 따라 점점 스파게티 코드가 되어가고 있음
이정도일 것 같다. db-query.js 같은 경우 sequelize를 사용하여 싹 갈아엎을 것이다. 또한 코드 리팩토링을 진행하여 주석을 달고 좀 보기 좋게 바꿔야 겠다.
'Projects > NodeBoard' 카테고리의 다른 글
Query방식에서 Sequelize ORM으로 전환 (0) | 2021.05.12 |
---|---|
Summernote 에디터 적용, imgbb 서버로 게시글 이미지 업로드 (2) | 2021.04.29 |
passportjs를 이용한 구글 로그인 (0) | 2021.03.17 |
댓글 답글 기능 구현 (0) | 2021.03.09 |
AJAX로 댓글달기 기능 구현 (5) | 2021.03.06 |
댓글