스프링 게시판 첨부파일 수정 로직에 대한 일기

전승원·2021년 1월 1일
0

Jpa

목록 보기
2/2

Spring data Jpa가 워낙 편리하기 때문에 게시판 CRUD를 만드는 것은 일도 아니었으나, 첨부파일이 들어가는 순간 얘기가 조금 달라지는 듯했다. AWS S3 사용을 해본지 꽤 오래되었기 때문에 스토리지 사용 경험해도 해볼겸, S3에 저장하고 수정, 삭제하는 로직도 어느정도 검색을 한 뒤에야 감을 잡을 수 있었다.

하지만 이렇게 스토리지에 저장하는 것보다 더 큰 문제는 첨부파일을 수정하는 Java 코드 자체였다.

  1. 기존의 첨부파일을 둔 채로, 첨부파일을 하나(혹은 여러개)더 추가한 경우

  2. 기존의 파일을 삭제하고 새로운 파일을 추가 한 경우

  3. 기존의 파일만 삭제한 경우

이렇게 다양한 경우의 수가 나오기 때문에, 이 3가지 경우를 모두 고려해서, 업로드할 파일은 업로드 해주고, 삭제 요청이 된 파일에 대한 데이터를 받아서 삭제 로직도 실행해주어야 한다.

사실, 크게 복잡한 것은 아닌 것이 삭제된 파일이 어떤 것인지에 대한 데이터만 서버로 넘겨줄 수 있다면 전혀 어려운 부분은 아니지만, 이 데이터를 받는 과정이 thymeleaf, spring mvc에 익숙하지 않은 나로서는 꽤나 골치가 아팠었다.

일단, hidden type의 input field가 있고 삭제 버튼이 클릭되면 해당 파일의 키 값을 input 태그의 value에 할당하여 이것을 서버에 넘겨주는 로직을 사용하기는 하였으나,

문제는 보안상 너무 취약하다..

막말로, 개발자 도구에서 해당 value 값에 아무 id 넣고 post 요청 때려버리면 다른 유저의 이미지 파일을 무작위로 삭제해버릴 수 있다.

이 부분에 대한 문제는 아래의 글을 참조하여 해결해 봐야겠다.

일단 핵심은 Client 측에서 오는 데이터는 절대 신뢰하지 않고 무조건 검증을 거쳐야 한다는 것이다.

https://stackoverflow.com/questions/42722651/prevent-users-change-of-hidden-field-value

해당 유저가 그러한 edit operation을 할 권한이 있는지 항상 체크 후에 로직을 실행시키면 될 것이다.

아니면, 애초에 클라이언트로부터 어떤 레코드와 직접적으로 관련이 있는 데이터를 받을 필요가 없도록 애초에 로직을 짜는 것도 방법이 될 것 같다.

File list를 넘겨주고 지워진 파일에 대한 인덱스 값만 받은 뒤 서버에서 이 인덱스를 이용해 업데이트 쿼리를 날리는 것이 좋은 방법이 될 것 같다.

profile
No pleasure, No gain

0개의 댓글