Anubis에 WebAssembly를 탑재하는 데 1년이 걸렸다

It took a year to ship WebAssembly in Anubis

Anubis는 AI 봇과 스크레이퍼를 차단하는 오픈소스 도구로, 이번 글에서는 WebAssembly(Wasm)를 통합하기까지 1년간의 여정을 소개합니다. 저자는 Rust로 작성된 Anubis에 Wasm을 추가하면서 겪은 기술적 도전과 설계 결정, 그리고 그 과정에서 얻은 교훈을 자세히 설명합니다. 특히 Wasm의 성능과 보안 이점을 강조하며, 실제 배포 경험을 바탕으로 한 유용한 팁을 제공합니다.

Wasm을 Anubis에 통합하는 데 1년이 걸렸지만, 그 결과로 얻은 성능과 보안상의 이점은 그 기다림을 충분히 가치 있게 만들었다.
  1. vintagedave

    > 내 경험상 이런 정확한 상황의 조합을 운영하는 사람들은 우연히 자신들의 길에 놓인 오픈소스 프로그램의 저자들에게 보여주는 친절함의 수준에 있어서도 큰 편차를 보이는 경향이 있다.

    이 말이 마음에 든다. HN에서 OSS 관리자들이 어떻게 대우받는지에 대한 과거 논의가 있었는데, 정말 재치 있는 문장이다. 그 문제에 대한 어조/태도가 정말 마음에 든다.

  2. doctor_radium

    저는 여기 있는 모든 Firefox 사본에 webassembly를 비활성화해 두었습니다... 왜냐하면 제가 Webassembly가 설계된 용도, 즉 온라인 게임, 비디오/오디오 편집, 에뮬레이션 등을 하지 않기 때문이고[1], 제가 모르는 사이에 백그라운드에서 무언가 실행되는 것을 싫어하기 때문입니다.

    그래서 이것은 흥미로울 것입니다.

    글쓴이에게 (작은 목소리로) 부탁합니다: 많은 사이트가 JavaScript에 대해 여전히 그렇듯이, Webassembly가 비활성화되었을 때 코드에 "이 캡차를 계속하려면 Webassembly가 필요합니다"라는 메시지를 추가해 주세요. 그리고 덧붙여서, Webassembly 엔진을 전혀 제공하지 않는 소규모 플랫폼/브라우저를 위해서도요.

    [1] https://webassembly.org/docs/use-cases/

  3. andai

    주제에서 벗어나지만 제가 Anubis로 보호되는 모든 페이지는 그냥 정적 HTML입니다. 그런데 봇 트래픽은 동적 페이지에서만 해롭지 않나요?

  4. dspillett

    > 또한 이는 "Claude야, CUDA Anubis 솔버를 대충 만들어 줘"라는 경로가 근본적으로 죽어 가고 있다는 것을 의미합니다.

    이전 챌린지들은 WASM을 사용할 수 없는 상황(JS가 있다면 사용 가능하다는 기준으로 작업하지 않는 한) 또는 대체 수단으로 여전히 사용할 수 있을 것이라고 가정합니다. TFA는 "스마트" TV를 명시적으로 언급하는데, WASM이 무엇인지 모를 만큼 오래된 브라우저를 실행하는 TV도 많을 것이라고 확신합니다. 솔직히 말하면 그것들은 저에게 우선순위가 아니겠지만, 이 프로젝트에서는 분명히 우선순위인 것 같습니다. TV(일반적으로, 특히 오래된 TV가 아니라)가 이 글에서 구체적으로 언급되기 때문입니다.

    만약 그렇다면, 스크래퍼가 새로운 메모리 하드 알고리즘을 전혀 실행하지 않고 그냥 폴백 POW 옵션을 강제하는 것을 막을 수 있는 것은 무엇일까요?

  5. kccqzy

    Xe가 하위 호환성에 이렇게 많은 시간을 쏟은 것에 대해 존경을 표합니다. 특히 Chrome 66을 대상으로 한 부분이요.

    저는 2014년 Mac에 Yosemite를 설치해 두고 가끔 제 프론트엔드 코드의 하위 호환성을 테스트하는 데 사용합니다(재미로!). 하지만 제 생각에 호환성을 보장하는 가장 좋은 방법은 당시에 맞는 툴체인이나 ClojureScript처럼 변화 속도가 더 느린 툴체인을 사용하는 것입니다.

  6. Aachen

    제 브라우저가 호환되는지 시험해 볼 수 있는 곳이 있나요? 작업하려고 할 때, 그리고 수백만 개의 웹사이트에 배포된 지금 알아내는 것보다 지금 알아내는 것이 더 쉽습니다.

    https://wasm-feature-detect.surma.technology 에서는 이 기능들 중 3개가 없다고 나오지만, Anubis가 그 중 어떤 것이 필요한지, 아니면 순수 JS 솔루션으로 되돌려 보내지 않기 위해 필요한지 잘 모르겠습니다.

    그것은 분명히 나쁠 텐데, 왜냐하면

    > 이 흐름과 함께 제공되는 WebAssembly는 엄청나게 빠릅니다. 이는 난이도를 [상향] 조정해야 할 수도 있음을 의미합니다. 봇이 wasm을 지원할 때 그것을 쉽게 풀지 못하도록 말이죠. 아마도 이런 뜻일 것입니다.

    그리고

    > wasm2js 흐름은 현재 진행률 표시줄을 업데이트할 방법이 없습니다 [그래서 남은 시간을 알 수 없습니다]

    (0 hashes per second에 멈춰서 페이지를 포기한 것이 처음이 아닐 것입니다)

  7. Georgelemental

    Rust의 `wasm32v1-none` 타겟을 사용하면 추가 타겟 기능 없이 기본 WASM을 얻을 수 있습니다. (그러나 이것은 `#[no_std]`로 제한됩니다.) https://doc.rust-lang.org/rustc/platform-support/wasm32v1-no...

  8. 0x696C6961

    POW를 미리 수행할 수 있다면 좋을 것 같습니다. 그러면 작업하는 동안 기다리지 않아도 되니까요. 브라우저가 나중에 사용할 수 있는 일종의 크레딧/토큰 같은 것이 있으면 좋겠습니다.

이 날의 다른 글

2026-09-06