가수면
조회수 어뷰징 방지 방법들 본문
게시글을 조회할 때마다 조회수가 늘어나는 것을 원치 않는 상황에서 시도할 수 있는 여러 방법들에 대해 소개한다.
아래의 경우엔 데이터베이스에 직접 저장하는 방법으로 가정했기 때문에 Redis를 이용하면 해당 단점을 상당히 완화할 수 있다.
방법론
게시글 클릭 이벤트 시에만 조회수 증가하는 api 요청 보내기
- 장점 -
1. 이미 조회한 게시글에 대해 새로고침, url을 직접해 유입하는 경우 조회수가 증가하는 어뷰징을 방지할 수 있다.
- 단점 -
1. 요청 api를 사용자가 수동으로 보내는 경우 조회수 어뷰징이 발생할 수 있다.
2. 이미 조회한 게시글에 대해서 클릭할 때마다 여전히 조회수가 증가한다.
요청하는 유저의 아이디를 DB에 저장해 검증
db 상의 게시글에 조회한 아이디와 그 시간을 기록해 요청에 대해 조회수를 증가시킬지 말지 분기하는 방법이다.
- 장점 -
1. 유저별 조회수를 정확하게 관리할 수 있다.
- 단점 -
1. 비로그인 유저에 대한 조회수를 카운트할 수 없다.
2. 데이터베이스 용량과 조회 시 추가 검증 로직으로 인해 서버 성능 저하 및 부하가 생길 수 있다.
요청하는 ip를 DB에 저장해 검증
db 상의 게시글에 조회한 ip와 그 시간을 기록해 요청에 대해 조회수를 증가시킬지 말지 분기하는 방법이다.
- 장점 -
1. 비로그인 유저도 식별해 조회수를 증가시킬 수 있다.
- 단점 -
1. 공공 와이파이를 사용하는 등의 공공 네트워크 환경에서 서비스를 이용하는 사용자의 조회수가 제대로 반영되지 않는 문제가 발생한다.
2. 유동 ip와 사용자가 ip를 의도적으로 변경할 경우에 대해 취약하다.
3. 데이터베이스 용량과 조회 시 추가 검증 로직으로 인해 서버 성능이 저하될 수 있다.
쿠키, 로컬 스토리지 사용
쿠키와 로컬 스토리지에 조회한 postId와 그 시간을 기록해 요청에 대해 조회수를 증가시킬지 말지 분기하는 방법이다.
- 장점 -
1. 공공 네트워크 환경의 유저를 식별해 조회수를 증가시킬 수 있다.
2. 비로그인 유저를 식별해 조회수를 증가시킬 수 있다.
3. 유동 ip에 대해 저항을 가진다.
4. 데이터베이스의 조작이 없기에 부담이 적다.
- 단점 -
1. 한 명의 유저가 다른 기기로 조회수를 증가시킬 수 있다.
2. 쿠키를 삭제할 수 있어 사용자가 의도를 가질 경우 어뷰징을 사실상 막을 수 없다.
쿠키 기반 + DB(하이브리드 방식)
여러 경우가 있지만 전부 허점이 존재한다.
1. 쿠키 기반 + DB에 쿠키 정보를 저장하는 경우: 비로그인 유저는 관리할 수가 없다.
2. 쿠키 기반 + DB에 IP정보를 저장하는 경우: 쿠키 삭제 후 최조 삭제에 대한 어뷰징은 방지할 수 있지만, 이후 재생성되는 쿠키로 인해 이미 조회한 게시글의 조회수가 다시 올라가는 문제가 발생한다.
3. 쿠키 기반 + DB에 아이디를 저장하는 경우: 1, 2번의 문제를 모두 가진다.
DB에 아이디 + IP 저장하고 둘 다 검증 (하이브리드)
로그인한 유저가 조회할 경우 아이디를 저장하고, 비로그인한 유저가 조회할 경우 IP를 저장하는 방식이다.
- 장점 -
1. 유저별 조회수를 정확하게 관리할 수 있다.
2. 비로그인 유저도 식별해 조회수를 증가시킬 수 있다.
3. 공공 네트워크 환경에서도 조회수를 어느정도 반영할 수 있다.
- 단점 -
1. 비로그인 상태 시 유동 ip와 사용자가 ip를 의도적으로 변경할 경우에 대해 취약하다.
2. 데이터베이스 부담이 커진다.
방식론
지연 업데이트
조회수를 즉시 데이터베이스에 반영하지 않고, 메모리 내의 일시적인 저장소(예: Redis, In-Memory Cache)에 임시로 저장한 뒤 일정 주기나 특정 조건 하에서 배치 작업으로 데이터베이스를 업데이트하는 방식이다.
- 장점 -
1. 서버의 부하를 줄일 수 있다.
2. DB를 거치지 않으므로 사용자에게 빠른 응답을 제공할 수 있다.
클라이언트 측 폴링
클라이언트 측에서 조회수를 관리하여 일정 시간마다 서버에 조회수 업데이트 여부를 확인하고, 한번에 보내는 방식.
- 장점 -
1. 불필요한 요청을 줄여 서버의 부하를 줄여준다.
- 단점 -
1. 관리 과정에서 사용자가 어뷰징할 수 있다.
2. 클라이언트 측에서 데이터가 누락될 가능성이 있다.
비동기 메시지 큐 사용
서버에서 조회수 증가 요청을 메시지 큐(예: RabbitMQ, Kafka)에 넣고, 별도의 백그라운드 프로세스나 서비스가 이를 처리하여 데이터베이스를 업데이트
- 장점 -
1. 비동기 처리로 응답 성능을 높일 수 있다.
'웹 개발 > 웹 개발' 카테고리의 다른 글
[Svelte] 기본 (0) | 2024.05.28 |
---|---|
Vercel의 배포 방식과 느릴 수밖에 없는 이유 (1) | 2024.04.12 |
SQL 쿼리 (0) | 2024.03.27 |
쿠키 보안 설정하기 (withCredentials, httpOnly 등) (0) | 2024.02.28 |
EC2로 Docker를 이용해 배포하기 (feat. Mysql) (0) | 2024.01.12 |