조회수 어뷰징 방지에는
여러 기법들이 존재한다
쿠키를 이용할 수 있고,
세션을 이용할 수도 있고,
ip 를 사용할 수 있지만
여기서는
로직을 활용한
아주 간단한 방법을 소개하겠다
먼저 게시글 상세페이지
진입 코드를 살펴보면
// 게시글의 title 누르면 게시글 상세보기 페이지로
$(document).on('click', '.detailPost', function() {
let postId = $(this).data('postid');
window.location.href = 'post/detailPost.do?postId=' + postId + '&viewSet=yes';
});
여기서 postId 는
게시글의 고유 식별 값,
viewSet 에 대한 yes 는
조회수 증가 식별 키워드이다
그리고 해당 값들을 받는
컨트롤러를 살펴보면,
@GetMapping("/detailPost.do")
public String detailViewbyTitle(@RequestParam("postId") int postId,
@RequestParam(name = "viewSet", defaultValue = "no") String viewSet, Model model) {
if (viewSet.equals("yes")) {
postService.setView(postId); // 조회수 증가 로직
return "redirect:detailPost.do?postId=" + postId; // 새로고침시 view 증가 방지
}
model.addAttribute("post", postService.detailViewbyPostId(postId));
model.addAttribute("comments", commentService.getCommentsByPostId(postId));
model.addAttribute("file", fileService.getFileByPostId(postId));
return "post/detailPost";
}
위와 같이
postId 를 필수로 받고,
viewSet 의 default 값은
no 로 세팅하게 되면
yes일 경우에만
조회수 증가 로직을 구동하고,
그렇지 않을 경우
조회수를 증가시키지 않는다
여기서 중요한 점은
if문 내부 두 번째 줄이다
조회수 증가 후
동일한 postId 를 가지고
동일한 컨트롤러로 재진입을 한다
그러나,
이때는 viewSet 의 값을 지정하지 않아
컨트롤러에서 자동으로 no로 식별하게 된다
따라서 애초에 viewSet 은
url 에 포함되지 않은 상태로
게시글 상세 보기 페이지로
진입하기 때문에
새로고침을 아무리 해도,
url 에 다른 방법으로 직접 접근해도,
조회수가 증가되지 않는다
(사전 방지로 해당 url 에
세션 권한이나 jwt 토큰을
활용하면 더더욱 좋을 것)
728x90
반응형
'Web Technologies 🖥️ > spring' 카테고리의 다른 글
[mybatis] - ' #{} '이랑 ' ${} ' 똑같은 거 아니였어? (0) | 2023.11.17 |
---|