프로젝트 배포를 했는데, XSS 공격이 가능하다는 것을 알게 되었다.
캠퍼분들과 튜터님이 게시글에 alert를 띄워놓고 난리였다..
무튼, 이걸 방어하기 위해서는 html 태그를 문자 그대로 출력되도록 해야했다.
튜터님은 프론트단에서 해줄 수 있다고 하셨는데, 우리가 방법을 못찾아서 그냥 백엔드 단에서 해보기로 했다.
캠퍼분의 도움을 받아 구현했고, lucy-xss-filter를 사용했다.
| PostService.java
// 게시글 저장 부분
...
Post post = Post.builder()
.title(postSaveRequestDto.getTitle())
.content(postSaveRequestDto.getContent())
.meetingType(postSaveRequestDto.getMeetingType())
.contact(postSaveRequestDto.getContact())
.period(postSaveRequestDto.getPeriod())
.build();
...
postRepository.save(post);
...
기존 코드에서는, Dto로 넘어온 제목, 본문을 Post 객체로 만들어 Repo에 바로 저장한다.
이렇게 구현했더니 배포하니까 XSS 공격에 당해버렸따
사용법은 간단하다.
1. 일단 의존성을 추가해준다.
| build.gradle
implementation 'com.navercorp.lucy:lucy-xss:1.6.3'
2. 사용하면 끝!
| PostService.java
// 게시글 저장 부분
...
Post post = Post.builder()
.title(XssPreventer.escape(postSaveRequestDto.getTitle()))
.content(XssPreventer.escape(postSaveRequestDto.getContent()))
.meetingType(postSaveRequestDto.getMeetingType())
.contact(postSaveRequestDto.getContact())
.period(postSaveRequestDto.getPeriod())
.build();
...
postRepository.save(post);
...
XSS 필터를 적용하고 다시 테스트해보니, XSS 공격을 방어할 수 있는 걸 확인할 수 있었다.