WHIRL v0.1.4가 10월 5일 나왔다. WHIRL은 Radeon AI PRO R9700용 네이티브 Windows C++/HIP LLM 추론 엔진이다.

릴리스는 새 기능과 속도 변화가 없는 버그 수정판이며 출력은 v0.1.3과 비트 단위로 같다고 밝힌다. 바뀐 기본값은 CORS 하나다.

웹 페이지의 출처에 따라 갈리는 CORS

CORS(Cross-Origin Resource Sharing)는 다른 출처의 웹 페이지가 응답을 읽어도 되는지를 브라우저가 판단하는 규칙이다. v0.1.4 이전에는 모든 응답에 Access-Control-Allow-Origin: *를 붙여 브라우저에 열린 어떤 페이지든 응답을 읽을 수 있었다.

이제는 localhost, 127.0.0.1, [::1]에서 제공하는 HTTP·HTTPS 페이지에만 포트와 관계없이 CORS 헤더를 보낸다. 페이지의 Origin을 그대로 돌려주고 Vary: Origin을 붙이며 *는 쓰지 않는다.

https://app.example.com 같은 다른 출처, 네트워크의 다른 컴퓨터에서 제공하는 페이지, Origin이 null인 file:// 페이지가 영향을 받는다. 요청은 서버에 닿지만 브라우저가 페이지에 응답을 넘기지 않는다.

OpenAI·Anthropic SDK, curl, IDE 코딩 에이전트, 스크립트처럼 브라우저 페이지가 아닌 클라이언트는 CORS를 쓰지 않아 영향이 없다.

다른 출처를 허용하는 옵션

다른 출처의 페이지에 접근을 다시 주려면 --cors-origin https://app.example.com처럼 지정하며, 출처마다 옵션을 반복한다.

--cors-origin "*"는 v0.1.4 이전의 전체 허용 동작을 되살린다. 웹 UI를 루프백 주소에서 제공하면 추가 허용 없이 그대로 동작한다.

CORS는 인증이 아니다

CORS 헤더는 브라우저의 응답 읽기만 제어하며 호출자가 누구인지 확인하지 않는다. HTTP 구현은 응답 헤더를 고르는 부분과 요청 처리를 분리해 둔다.

태그에 고정된 테스트는 루프백 판정에서 null, localhost.evil.com, 127.0.0.1.nip.io 같은 출처를 거부하는지 확인한다. 이 글은 소스를 읽었을 뿐 테스트를 실행하지 않았다.

바인딩 주소와 API 키

서버 가이드는 기본 바인딩 주소와 포트를 127.0.0.1:8080으로 적고, 어떤 API 키든 받는다고 명시한다. 그래서 클라이언트에 API 키 입력란이 있다고 자격 증명 검사가 있는 것은 아니다.

네트워크 노출 범위를 넓히는 일은 출처 허용과 별개로 접근 제어를 따로 검토해야 하는 문제다.

멈춘 스트리밍 클라이언트의 처리

이전에는 스트리밍 클라이언트가 응답 읽기를 멈추면 엔진이 그 연결에 묶여 다른 사용자의 슬롯까지 멈출 수 있었다. 이제 엔진은 클라이언트를 기다리지 않고, 30초 동안 데이터를 전혀 받지 않는 연결을 끊고 슬롯을 비운다.

HTTP 옵션에서도 send_timeout_ms 기본값은 30000이며, 이 제한은 추론 시간이 아니라 전송이 멈춘 상태에 걸린다. 긴 답변을 30초 안에 끝내야 한다는 뜻이 아니다.

테스트는 읽지 않는 스트림이 있는 동안 다른 요청이 1초 안에 HTTP 200으로 끝나는지 확인하고, 멈춘 요청이 정리된 뒤 슬롯이 비는지 본다. 시간 제한은 테스트용으로 2초로 줄였다.

새로 생긴 HTTP 제한

릴리스는 동시 연결 64개, 요청 줄과 헤더 수신 60초, 요청 읽기 사이 유휴 30초, 헤더 64 KiB·100줄 제한을 적는다. 요청 본문과 클라이언트에 보내지 못하고 쌓인 응답 데이터는 각각 64 MiB로 제한된다.

GGUF 파서는 경계 검사가 오버플로하지 않도록 바뀌었고, GPU 메모리를 할당하기 전에 모든 텐서의 타입과 형상을 검사한다. 이는 문서에 적힌 내용이며 이 글이 부하나 보안 테스트를 한 결과는 아니다.

주의할 점: 좁은 지원 환경

요구 사항은 그대로 Windows 11, Adrenalin 26.8.1 이상, R9700(gfx1201) 한 장이다. README가 지원하는 아키텍처는 qwen35와 qwen35moe뿐이다.

소스에는 Apache License 2.0이 적용되지만, 따로 내려받는 모델의 라이선스까지 정하지는 않는다. 릴리스에는 whirl-0.1.4-windows-x64.zip과 SHA-256 파일이 있고, 이 글은 ZIP을 설치하거나 실행하지 않았다.

WHIRL v0.1.4는 브라우저 응답 읽기를 루프백 출처로 좁혔을 뿐 인증을 더하지 않았으므로, 업그레이드 때는 웹 UI의 출처와 서버의 네트워크 노출을 따로 확인해야 한다.