Spring/Issue

조회수 기능 구현하기 - 중복 방지(Session)

블로그 주인장 2024. 1. 2.

Issue

이전 포스팅에서 조회수 기능을 중복 방지할 수 있도록 세션 쿠키(Session-Cookie)를 사용했다.

https://miiro-under.tistory.com/259

 

조회수 기능 구현하기 - 중복 방지(Cookie)

Issue 커뮤니티 서비스를 구현하는 토이프로젝트를 진행하면서 게시판의 조회수를 증가 로직을 만드려고 합니다. 게시글이 조회될 때마다 조회수를 증가하는 게 가능하지만 동일 사용자에 한해

miiro-under.tistory.com

 

세션 쿠키는 사용자가 웹 사이트를 탐색하는 동안 생성되고 유지되며, 브라우저가 닫히면 삭제가 된다.

 

그런데 현재 나는 RESTful API를 구현하는 시나리오로 해당 토이프로젝트를 진행 중이다.

RESTful API의 경우, 클라이언트와 서버 간 통신이 브라우저 개입이 없이 이루어지기 때문에 쿠키의 유지 및 관리에 대한 일반적인 웹 브라우저의 동작은 해당이 되지 않는 것이었다.

 

이로 인해 쿠키를 사용하는 게 아닌 헤더를 통한 인증이나 다른 방식을 선호한다.

 

그래서 이를 바탕으로 session을 이용해서 로직을 구현해보겠습니다.

 

 

Session 을 활용한 코드

 

클라이언트가 서버에 최초로 접속하면 서버에서는 클라이언트에게 고유한 세션 아이디인 JSESSIONID 를 부여하고, 이를 쿠키에 담아 클라이언트에게 전송합니다.

 

그리고, 클라이언트 세션에서 중복 조회 여부를 확인 후에 중복 요청이 아니면 세션에 저장했습니다.

이후, 클라이언트는 이 쿠키를 서버에 함께 보내며 세션을 유지하게 된다.

 

또한, 해당 조건에 부합하기 때문에 조회수를 증가되는 형식으로 구현했습니다.

 

프로젝트를 종료하면 데이터가 삭제가 됩니다.

 

하지만, HttpSession은 기본적으로 유효시간이  1800s 가 설정되어 있습니다.

그렇기 때문에, 프로그램을 종료하지 않아도 해당 시간이 지나면 자동으로 세션에 저장되어 있던 아이디는 삭제가 됩니다.

 

알아야할 점!!

RESTful API는 각 요청이 독립적으로 처리되고 클라이언트가 상태를 관리하도록 설계되어 있습니다. 

클라이언트는 요청에 필요한 모든 정보를 제공하고, 서버는 그에 따라 응답을 반환합니다. 

따라서 세션 ID와 같은 상태를 유지하는 메커니즘은 RESTful API에서 불필요하며, 오히려 부가적인 복잡성을 가져올 수 있습니다.

 

대신, RESTful API에서는 주로 토큰 기반의 인증을 사용합니다. 클라이언트는 인증을 위한 토큰을 요청에 포함시켜 서버에 전달하고, 서버는 해당 토큰을 검증하여 클라이언트를 인증합니다. 이 방식은 상태를 유지하지 않으면서도 안전하게 인증을 수행할 수 있습니다. 따라서 RESTful API에서는 세션 ID(JSESSIONID) 대신 토큰 기반의 인증을 사용하는 것이 일반적이라는 것입니다.

 

 

한 줄 정리

동일 사용자에 대한 조회수 중복 방지를 체크하려는 작업이 단순하게 끝날 줄 알았습니다.

쿠키부터 세션은 물론이고, 현재 구현하려는 RESTful API의 특징에 대해 다시금 공부할 수 있었던 거 같습니다.

현재 프로젝트 상의 컨셉 상 Session을 사용했지만, 차후에 이를 바탕으로 프로그램을 설계할 때부터 차근차근 살펴보면서 컨셉에 맞는 로직을 구현할 수 있도록 하겠다.

 

 

틀린점이 있거나 다른 부분으로 고쳐야할 게 있으면 댓글 남겨주세요!

반응형

댓글