파괴는 창조에 앞선다.

이 글의 목차5개
  1. 리로그 조회수는 언제 올라갈까?
  2. 쿠키 하나가 한 사람은 아니다
  3. 한 시간을 기다리지 않아도 되는 이유
  4. 테크 기업 버그 바운티 보상금
  5. 정의의 철퇴

원문: 리로그에서 읽기

해킹은 현재 구현된 시스템 위에서 일어난다.

그리고 보안은 발견된 취약점으로부터 발전한다.

즉, 취약점에 대한 공격은 항상 선행되고 그것에 대한 대응은 뒤따른다.

공격할 수 없는 시스템을 구축하는 것은 불가능하다.

개발자는 공격받을 수 없는 시스템을 만드는 것이 아니라, 공격할 필요가 없는 시스템을 구축해야 한다.

그리고 내게 이유는 충분하다.

리로그 조회수는 언제 올라갈까?

글 상세 화면을 읽는 GET 요청과 조회수를 등록하는 요청은 분리되어 있다.

프론트엔드는 실제 상세 화면에 들어왔을 때 다음 요청을 보낸다.

POST /v1/posts/222/views

백엔드는 로그인한 사람에게는 회원 ID를, 비회원에게는 rilog_visitor 쿠키의 UUID를 방문자 식별자로 사용한다.

비회원에게 쿠키가 없으면 새 UUID를 만들어 쿠키로 내려준다.

같은 글에서 같은 식별자로 다시 들어오면 마지막으로 인정된 조회부터 한 시간 동안 중복으로 처리한다.

작성자가 로그인해서 자기 글을 본 경우에는 조회수를 올리지 않는다.

브라우저가 아니라 쿠키를 보관하지 않는 프로그램이 요청한다면 어떨까?

쿠키 하나가 한 사람은 아니다

curl -i -X POST 'https://api.rilog.kr/v1/posts/222/views' \
  -H 'Origin: https://www.rilog.kr' \
  -H 'Content-Length: 0'

운영 API는 204 No Content와 새로운 rilog_visitor 쿠키를 반환했다.

새 비회원 식별자를 발급한다는 코드의 동작이 실제 응답에서도 보였다.

curl은 별도의 쿠키 저장소를 지정하지 않으면 응답에서 받은 쿠키를 다음 요청에 자동으로 보내지 않는다. 같은 명령을 다시 실행하면 서버는 또 쿠키가 없는 요청을 받는다.

서버는 다시 새 UUID를 발급하고, 그 UUID에는 이 글을 읽은 기록이 없다.

한 시간을 기다리지 않아도 되는 이유

중복 조회를 판단하는 기준은 IP도, 브라우저도 아니다. 글 ID와 방문자 식별자의 조합이다.

비회원 요청에 rilog_visitor 쿠키가 없으면 서버는 새 UUID를 만든다.

그 UUID로 이 글을 조회한 기록은 없다. 따라서 한 시간 제한을 검사할 때 비교할 이전 시각도 없다.

우회 방법은 발급받은 쿠키를 다음 요청에 보내지 않으면 된다.

from urllib.request import Request, urlopen

url = "https://api.rilog.kr/v1/posts/222/views"

for _ in range(3):
    request = Request(url, data=b"", method="POST")

    with urlopen(request, timeout=15) as response:
        print(response.status, response.headers.get("Set-Cookie"))

요청이 반복될 때 서버의 로직

  1. 쿠키가 없다.
  2. 새 UUID를 발급한다.
  3. 이 UUID로 조회한 기록이 없다.
  4. 조회를 인정하고, 응답으로 쿠키를 내려준다.
  5. 클라이언트는 그 쿠키를 보관하지 않는다.

그다음 요청은 다시 1번부터 시작한다.

당신이 이 글을 읽는 순간에도 조회수는 올라가고 있다.

테크 기업 버그 바운티 보상금

기업 최대 보상금 (USD) 주요 대상
Apple $5,000,000 초과 iOS 고급 공격 체인, 특별 보너스 포함 Apple Security Research
Google $1,500,000 Android·Pixel 보안 칩 공격 Google Bug Hunters
Samsung $1,000,000 Galaxy 기기 탈취·권한 우회
Meta $300,000+ 모바일 원격 코드 실행(RCE) Facebook
Microsoft $250,000 Hyper-V 등 핵심 제품 취약점 Microsoft
Shopify $200,000 치명적인 플랫폼 취약점 HackerOne
OpenAI $100,000 ChatGPT 등 제품·인프라 보안 취약점 OpenAI
GitHub $30,000+ VIP 프로그램 기준, 일반 공개 프로그램 $10,000
리로그 ?

정의의 철퇴

10월 21일
10월 22일

전체 글 보기