본문 바로가기
Web Technologies 🖥️/spring

간단한 게시글 조회수 어뷰징 방지 (쿠키, 세션, ip 사용 X) - [Spring]

by dudefromkorea 2023. 11. 13.

조회수 어뷰징 방지에는

여러 기법들이 존재한다

 

쿠키를 이용할 수 있고,

세션을 이용할 수도 있고,

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
반응형