# Show GN: Velog 조회수 확인 API(베타)

> Clean Markdown view of GeekNews topic #23718. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=23718](https://news.hada.io/topic?id=23718)
- GeekNews Markdown: [https://news.hada.io/topic/23718.md](https://news.hada.io/topic/23718.md)
- Type: show
- Author: [day1swhan](https://news.hada.io/@day1swhan)
- Published: 2025-10-17T13:32:57+09:00
- Updated: 2025-10-17T13:32:57+09:00
- Original source: [github.com/day1swhan](https://github.com/day1swhan/velog-view-counter)
- Points: 5
- Comments: 0

## Summary

**Markdown** 문법을 지원하는 **Velog** 등 블로그 플랫폼에서 간단히 **1x1 투명 이미지**를 삽입하는 방식으로 방문자 **페이지 뷰**를 기록하고 조회하는 API가 베타로 공개되었습니다. Cloudflare **Workers KV**의 무료 플랜을 활용하여 적은 개발 노력으로 **방문자 및 뷰 카운팅**을 구현하며, **식별값(slug), 해시, 날짜, UserAgent** 정보로 중복을 최소화하고, 확장성과 실용성을 보장합니다. 실시간성이나 대규모 트래픽에는 한계가 있지만, **다양한 검색·필터** 지원, **API 보안** 등 기능이 곧 추가될 예정이고, 서비스 API화 및 **웹훅·이메일 알림** 기능 계획도 있습니다. API 구조와 전체 코드는 공개되어 있어, **블로그 방문자 통계** 구축에 관심 있는 개발자라면 참고할 만합니다.

## Topic Body

#### 개발 배경 및 구현 아이디어  
  
- [Velog](https://velog.io/@day1swhan)에 작성한 게시글들 조회수가 궁금한데 매번 로그인해서 확인하기 귀찮음  
- Velog 내부 조회수 API 리버싱해도 되지만 귀찮아질 것 같고 확장성(ex. 방문자 알림)이 떨어짐  
- 예전 국내 메일 서비스들이 픽셀 이미지를 이용해서 읽음 확인 기능을 제공하던 것이 생각남  
- Velog는 Markdown 문법을 이용한 게시글 작성을 지원함  
- 브라우저는 cross-site 도메인이여도 단순 이미지 호출은 차단하지 않음  
- 게시글에 1x1 픽셀의 투명 이미지를 삽입하면, 게시글이 조회될 때마다 서버 측에서 호출 기록을 남길 수 있음  
- 대부분의 Velog 유저들의 게시글은 하루 1,000명 이상의 방문자가 나오지 않음. 이 정도 트래픽에는 Workers KV를 이용해도 충분함  
- Velog 한정이 아닌, Markdown 문법으로 이미지 삽입을 지원하는(사용자 도메인에서 이미지 제공이 가능한) 플랫폼이라면 모두 사용 가능  
  
#### 작동 방식  
  
- 이미지에 **식별 값**(slug)을 부여 후 CDN이 아닌 프로그래밍 가능한 Workers를 이용해 응답을 제공하고, 식별 값을 KV의 `Key prefix`로 사용해서 호출 기록을 저장하면, 간단하게 페이지 뷰를 구할 수 있음  
- **날짜**, **ip**, **userAgent**, **이미지 식별 값**을 `Hash` 함수를 이용해 key 값으로 만들면 최소한의 중복 방문 처리가 가능함  
  - **HASH**: SHA-256 기반 128비트 해시를 base64url(22자)로 인코딩.  
  - **KEY**: `view:${slug}:${hash}`.  
  - **VALUE**: UserAgent, Date...  
- Workers KV 무료 플랜은 하루 1,000개의 PUT, LIST를 지원함.  
  - **PUT**: 하루 **1,000개**의 방문자 카운팅 정보를 **저장** 가능  
  - **LIST**: 하루 **1,000개 이상**의 페이지 뷰 정보를 **제공** 가능  
- 페이지 뷰 조회 요청에는 LIST 명령을 사용하는데, 식별값(slug) 정보를 `prefix`로 이용해서 가져온 후 이를 단순 카운팅하면 됨  
  - 페이지 뷰 조회는 실시간성이 크게 중요하지 않으니 **응답 값을 적절히 캐싱하면** 하루 1,000개 이상의 요청 처리가 가능해짐  
  
#### 한계  
  
아무래도 빠른 개발을 위해 단순한 저장소인 KV를 사용하다 보니 다음과 같은 한계가 있음.  
  
- **Eventual consistency**: Workers KV PUT 요청은 실시간이 아님. 실시간성이 꼭 필요하다면 [Durable Objects(DO)](https://developers.cloudflare.com/durable-objects/concepts/what-are-durable-objects/)를 사용해야 함.  
- **LIST 의존**: LIST 명령을 이용한 카운팅 방식은 (페이지 뷰가 꾸준히 나온다는 가정하에) 시간이 지나면서 가져와야 하는 KEY 값들이 많아질수록 느려짐. Cron 작업으로 꾸준히 저장 구조를 업데이트하거나, DO 또는 [Analytics Engine](https://developers.cloudflare.com/analytics/analytics-engine/) 사용을 고려해야 함.  
  
#### 지원 예정  
  
최대한 빠른 시일 내에 다음과 같은 기능들을 추가할 예정.  
  
- **날짜별 정렬**: [서버리스 블로그 댓글 API 30분 만에 만들어보기](https://blog.day1swhan.com/articles/build-blog-comments-api-with-workers-kv?utm_source=news.hada.io&utm_medium=referral)에서 최신 댓글 정렬을 위해 사용한 방식인 **Unix Time**을 이용하면 최신 세션 기준으로 정렬된 목록을 제공할 수 있음  
- **API 보안**: 미들웨어 추가로 지원 예정. HTTP Authorization 헤더를 이용할 예정  
- **Rate Limit**: 인기 Velog 유저라면 시기와 질투에 눈이 먼 사용자들이 악의적 요청을 날릴 수 있으니 대비책이 필요합니다. 아마 본인은 해당되지 않아서 가장 마지막에 추가될 예정...  
- **검색**: API 추가로 지원 예정  
  - **날짜**: 특정 날짜, 기간별 검색 기능. KEY 구조 변경 필요  
  - **세션**: 특정 세션 활동 정보 검색 기능. 현재 세션 정보는 각 포스팅에 대해서 하루 동안 유효함. 개인정보보호 정책 검토 필요  
  - **브라우저/OS**: UserAgent에서 파싱 한 정보로 제공 예정. 정교하진 않아도 대략적인 파악이 가능함  
- **서비스 API**: 누구나 쉽게 **이메일 인증 + 개인키 발급**으로 사용할 수 있도록 API를 서비스 형태로 제공 예정  
  - **웹훅**: 페이지 뷰 이벤트 발생 시 POST 요청 제공. 개발자들이 좋아하는 Slack을 이용한 알림 가능해짐  
  - **이메일**: 웹훅 처리가 귀찮은 사용자들을 위해 고전이지만 편리한 알림 기능  
  - **Custom campaign**: 설정된 이벤트(ex. 특정 조회수 도달)가 통합된 이미지 식별 값(slug) 제공  
  
#### 추가  
  
- 내부 작동 구조에 관심 있으신 분들은 [1x1 픽셀로 시작되는 Velog 조회수 확인 API 개발기](https://blog.day1swhan.com/articles/velog-view-counter?utm_source=news.hada.io&utm_medium=referral)를 참고해 주시기 바랍니다.  
- 설치·배포 방법, 자세한 API Reference, 전체 코드는 [Github](https://github.com/day1swhan/velog-view-counter) 저장소에서 확인하실 수 있습니다.

## Comments



_No public comments on this page._
