웹 서비스에서 조회수 기능은 다양한 목적을 위해 사용된다. 단순히 얼마나 조회했는지 파악하기 위해 사용할 수도 있고, 수익을 산정하거나 이벤트 목적으로 사용할 수도 있다. 보통 조회수 기능을 구현하기 위해 쿠키를 활용하지만, 쿠키의 특성으로 인해 조회수 기능에 문제가 생길 수도 있다. 쿠키의 특성과 발생 가능한 문제에 대해 먼저 알아보자.
쿠키는 HTTP 통신에서 클라이언트와 서버의 상태를 유지하기 위해 사용한다. 생성된 쿠키는 서버에 요청을 보낼 때 함께 전송되고 서버는 쿠키를 사용해 필요한 데이터를 조회할 수 있다.
먼저 서버가 클라이언트의 요청을 받았을 때, 쿠키가 없으면 새로 쿠키를 생성한다. 이후 클라이언트의 요청에 쿠키가 존재하면 이미 방문한 사용자로 간주하고 조회수를 증가시키지 않는다. 서버 측에서는 별도로 정보를 관리하지 않아도 되고, 요청에 쿠키가 있는지 확인만 하면 된다.
하지만 이 방식은 쿠키가 없다면 매번 새로운 요청으로 간주하는 단점이 있다. 쿠키는 클라이언트가 관리하기 때문에 사용자가 임의로 쿠키를 삭제할 수 있다. 만약 사용자가 악의적으로 쿠키를 삭제하고 요청하는 과정을 반복한다면, 조회수는 비정상적으로 올라가게 된다.
비즈니스상 조회수가 중요하지 않다면 큰 문제가 아니지만, 유튜브나 웹툰처럼 조회수가 수익과 직결되는 서비스일 경우 치명적인 문제로 이어진다.
그럼 클라이언트가 삭제하지 못하도록 서버에서 정보를 관리하면 해결할 수 있을까?
보통 쿠키의 단점을 보완하기 위해 세션을 사용한다. 세션은 서버에서 상태를 관리하고 임의의 세션 ID를 쿠키로 전달하기 때문에 세션의 만료 기간을 지정해 두었다면 쿠키를 삭제하더라도 해당 세션은 서버에서 사라지지 않는다. 하지만 세션 ID는 무작위로 생성되기 때문에 기존의 세션에 다시 매핑하지 못한다면 매번 새로운 세션이 생성되고, 조회수 또한 계속해서 증가하게 된다.
결국 조회수 어뷰징을 방지하기 위해서는 사용자를 특정한 후, 사용자가 조작하지 못하도록 서버에서 관리해야 한다. 사용자를 특정할 수 있는 방법에는 어떤 것들이 있을까?
요청 정보에서 출발지의 IP 주소를 추출할 수 있다. 서버는 IP 주소 기반으로 생성한 식별자를 사용자에게 전달하고, 요청이 올 때마다 해당 식별자가 방문 기록에 있는지 확인하면 중복을 체크할 수 있다.
하지만 IP 주소는 불변하고 고유한 식별자가 아니기 때문에 다음과 같은 한계가 존재한다.
VPN 이란 가상 터널을 사용해 인터넷을 사설 네트워크처럼 사용 가능하도록 돕는 기술이다.
인터넷상의 여러 노드를 거치는 과정에서 발생하는 보안 문제를 해결하기 위해 사용하며, VPN이 제공하는 보안 기능을 사용하면 안전하게 통신할 수 있다.
VPN은 사용자 정보 보호를 위해 가상의 IP 주소를 제공하는데 이를 보안 목적으로 사용하지 않고 악용하면 다른 사용자인 것처럼 접근할 수 있게 된다.
학교나 회사처럼 대규모 집단의 경우 프록시 서버를 공유해서 사용하는데, 이 경우 실제 IP 주소는 가려지고 프록시 서버의 IP 주소가 노출된다.
X-Forwarded-For 헤더를 사용해서 실제 IP 주소를 확인할 수도 있지만, 항상 알아낼 수 있는 것은 아니다. 때문에 악의적인 사용자가 여러 프록시 서버를 거쳐 여러 사용자인 것처럼 행세할 수 있게 된다.
이처럼 IP 주소를 활용한 방식은 IP 주소만 조작하면 손쉽게 무력화 시킬 수 있다.
사용자를 특정할 수 있는 방법을 찾아보다 브라우저 지문에 대해 알게 되었다.
사용자의 브라우징 패턴과 소프트웨어 및 하드웨어 정보 등을 기반으로 생성한 특별한 식별자로 보통 브라우저에서 생성한 후 서버로 전달된다. 브라우저 지문이 활용하는 정보는 다음과 같다.
정보 | 설명 |
---|---|
User-Agent | 브라우저, 버전, 운영 체제 등의 정보가 포함된 HTTP 헤더 |
스크린 | 픽셀 단위의 화면 크기와 해상도 정보 |
폰트 | 설치된 폰트 목록 및 설정 정보 |
쿠키 | 쿠키 설정과 관련된 정보 |
언어, Locale | 브라우저의 언어 설정 및 지역 정보 |
플러그인, 확장 프로그램 | 설치된 플러그인과 확장 프로그램 목록 |
하드웨어 | CPU, 그래픽 카드 등 사용자의 장치 정보 |
네트워크 | IP 주소, 네트워크 타입 등의 정보 |
시간 | 지역 시간대 정보 |
이 밖에도 웹 스토리지 사용량, 터치 지원 여부 등 다양한 정보를 활용해서 브라우저 지문을 생성한다.
하지만!
브라우저 지문을 사용하면 추적을 허용하지 않아도 지속적으로 사용자를 추적할 수 있게 된다. 때문에 사용자를 보호하기 위해 브라우저 지문은 사용할 수 없다. 참고
그리고 브라우저 지문을 사용한다고 해도 동일한 환경의 사용자가 존재하거나, 설정 정보를 조작하는 상황을 대처하는 것은 여전히 힘들다.
사용자를 특정할 수 있는 불변하고 고유한 값이 존재하지 않기 때문에 어떻게든 조작할 가능성이 존재한다. 때문에 모니터링 시스템을 구축하고 문제 상황을 대처할 수 있도록 준비하는 것도 중요하다.
사용자의 행동 패턴을 분석하여 일정한 패턴을 벗어나는 경우를 감지한다. 예를 들어, 한 사용자가 동시에 여러 개의 컨텐츠에 접근하는 경우, 이를 의심해 볼 수 있다.
인기가 급상승하는 컨텐츠의 경우, 평소에 조금씩 노출되다가 특정 계기를 기점으로 조회수가 급격히 증가하게 된다. 하지만 이런 전조증상 없이 조회수가 급격히 증가할 경우, 뷰봇 등을 의심해 볼 수 있다.
하지만 이렇게 분석하는 방식도 특정 상황에서는 효과를 보기 힘들다. 예를 들어, 서비스 홍보를 위해 100번째, 1000번째 등 특정 차례에 방문하는 고객에게 상품을 주는 이벤트의 경우, 사용자를 특정하지 못하면 모두 정상 요청으로 볼 수밖에 없다.
조회수 어뷰징이 창이라면 방패가 좀 더 불리한 싸움이라고 생각한다. 한 가지 방법으로는 이를 완벽하게 해결할 수 없다. 그래도 최소한 쿠키를 사용해서 어뷰징하기 쉬운 환경을 조성하는 일은 없어야 한다.
브라우저 지문이 활용하는 정보를 보면 User-Agent, 하드웨어 등의 정보를 확인할 수 있다. 브라우저 지문을 사용하는 것은 좋은 방법이 아니지만 여기서 활용하는 몇 가지 정보를 조합해서 특별한 식별자를 만들 수는 있다. 그리고 해당 식별자를 조작할 수 있는 시나리오를 구상하고 미리 대비한다면 효과적으로 대처할 수도 있다.
예를 들어, User-Agent와 하드웨어 정보를 조합해서 식별자를 만들었을 때, 하드웨어의 정보는 그대로지만 User-Agent의 정보만 조금씩 바뀌면서 접근하는 경우 어뷰징을 의심해 볼 수 있다.
이처럼 완벽하게 막을 수는 없어도, 조금이라도 어뷰징하기 힘든 상황을 만드는 것이 최선이라고 생각한다.
쿠키를 활용한 조회수 기능에 어떤 문제가 있는지 또, 이를 해결하기 위해서 어떻게 접근해야 하는지 알아보았다. 간단하게 정리해 보며 마무리하자.
쿠키는 클라이언트 측에서 조작하기 쉽기 때문에 조회수가 중요한 역할이라면 사용하지 않아야 한다.
사용자를 특정하면 조회수 중복을 체크할 수 있지만, 한계가 있다.
IP 주소는 VPN과 프록시 서버를 사용해 의도적으로 변경할 수 있다.
브라우저 지문으로도 사용자를 완벽하게 특정할 수 없으며, 사용자 정보 보호를 위해 사용하지 않아야 한다.
모니터링을 통해 비정상적인 접근을 감지하고 대처하는 것도 중요하다.
사용자 요청 패턴이 비정상적이라면 이를 의심해 볼 수 있다.
전조증상 없이 조회수가 급격히 증가하는 경우를 의심해 볼 수 있다.
완벽한 해결 방법은 없지만, 다양한 방법을 활용해서 독자적인 시스템을 구축하고 어뷰징하기 힘든 상황을 조성하자.
https://www.mozilla.org/ko/firefox/features/block-fingerprinting/
https://aws.amazon.com/ko/what-is/vpn/