며칠 전 Anthropic이 Claude Fable 5를 공개했습니다. 공식 발표를 보자마자 눈에 들어온 건 성능 수치보다 기간이었습니다. 6월 22일까지 한정. 급하게 켰습니다.


업무에서 먼저 돌렸다

오늘 정기 배포가 있었습니다. 배포한 부분과 영향이 있는 듯 없는 듯 한 곳에서 작은 이슈가 하나 나왔고, 그걸 확인하는 과정에서 Fable 5를 처음 붙여봤습니다.

1년된 버그 — 인입매체코드가 지워지고 있었다

이슈를 추적하다 보니 주문서 인입 시 특정 경로에서 인입매체코드(유입 채널을 추적하는 값)가 제거되고 있었습니다. 로직 자체가 깨진 건 아닙니다. 주문은 정상적으로 들어옵니다. 그러니 1년 동안 아무도 몰랐습니다.

문제는 실적 데이터입니다. 어떤 경로로 들어온 주문인지 추적이 안 되면 마케팅 성과를 신뢰할 수 없습니다. 조용히 오염되고 있었던 겁니다.

6년된 정책 불일치 — 쿠키 시간이 제각각이었다

1년된 버그를 설명 듣고 나서, 한 가지 더 확장해서 찾아봐달라고 했습니다. 그랬더니 이번엔 더 오래된 것이 나왔습니다.

인입매체코드는 쿠키에 담겨 일정 시간 유지됩니다. 정책상 40분으로 설정되어 있는데, 일부 경로만 24시간으로 박혀 있었습니다. 6년 동안.

이것도 주문이 깨지는 이슈가 아니다 보니 QA에서 걸리지 않았습니다. 40분짜리 유저와 24시간짜리 유저가 섞여서 데이터가 집계되고 있던 셈입니다.


로직 이슈가 아니라 데이터 오염 문제였습니다. 서비스는 멀쩡하게 돌아가고, 에러 로그도 없었으니까요. 그래서 오래 묻혀 있었습니다.

그런데 솔직히 “찾는 능력”보다 인상적인 게 따로 있었습니다. 로직이 워낙 복잡해서 한 줄씩 따라가며 설명을 요청했는데, 흐름을 순서대로 엮어서 이해가 되게 설명하는 능력이 달랐습니다. 아마 찾는 능력도 그 능력에서 나오는 것 같습니다. 코드의 맥락을 잃지 않고 연결하는 것.

기획자에게 이 이슈를 이해시켜야 했는데, 직접 볼 수 있는 예시 데이터를 달라고 했더니 코드만 가지고 쿼리를 작성해줬습니다. 저는 그걸 그대로 실행해서 실제 데이터를 눈으로 확인할 수 있었습니다. 그럼에도 기획자분은 정책 설명을 듣고 너무 복잡해하셨습니다. 어떻게 보면 당연합니다. 6년치 레거시 정책이니까요.


사이드 프로젝트도 돌렸다

업무 코드 이후에 개인 프로젝트 두 개도 검수를 맡겼습니다.

pick-a-meme — 입력 검증 누락 & 보안 헤더

PR #149

SaveCompositionRequest의 imageUrl, phrase, subjectPosition 필드에 검증 제약이 전혀 없었습니다. 길이 제한도, @NotBlank도 없이 그대로 받고 있었습니다.

보안 HTTP 헤더도 마찬가지였습니다. X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy까지, 하나도 설정이 안 되어 있었습니다. 혼자 만드는 프로젝트니까 대충 넘겼던 부분인데, 막상 리스트로 뽑히니까 찜찜하더라고요.

chaos-drop — XSS, 입력 우회, 성능

PR #55

세 가지가 나왔습니다.

첫째, XSS. 모바일 리더보드의 updateMobileMiniLB() 함수가 참가자 이름을 이스케이프 없이 innerHTML에 직접 넣고 있었습니다. <img src=x onerror=alert(document.cookie)> 같은 이름을 입력하면 스크립트가 실행됐습니다.

둘째, 입력 우회. maxlength="30" 속성이 있어도 붙여넣기로 우회할 수 있었습니다. 게다가 이름이 많아지면 충돌 연산이 O(N²)로 증가해서 브라우저가 멈추는 구조였습니다.

셋째, 성능. getWallAtY() 함수가 매 호출마다 인덱스 0부터 선형 탐색을 하고 있었습니다. 125개 정점, 호출 지점 12곳. 이걸 이진탐색으로 바꿨더니 457ms → 118ms, 약 3.9배 빨라졌습니다.


쓰면서 느낀 것

10일이 남았습니다. 솔직히 이 기간 안에 주문·정책 관련 코드를 전수 점검하고 싶습니다. 오늘 나온 두 케이스처럼, 오래됐지만 조용한 이슈들이 분명히 더 있을 것 같아서요. 현실적으로 어렵겠지만, 최대한 써볼 생각입니다.

이런 도구가 강력할수록 개발자의 “보는 눈”이 더 중요해지는 것 같습니다. 오늘 케이스도 로직이 꽤 복잡했는데, Java와 회사 코드의 맥락을 모른다면 Fable이 아무리 잘 설명해줘도 그게 문제인지 아닌지를 판단하기 어려웠을 겁니다. 기획자분이 그걸 어려워하셨던 것처럼요.

그간 Opus에 대한 실망감이 누적되어 있었습니다. 기대치가 낮아져 있었는지도 모릅니다. 그런데 하루 쓴 것만으로도 체감이 다르더라고요. 아직 단언하기는 이르지만, 오늘만큼은 확실히 뭔가 다르다는 느낌이 듭니다.

22일까지 더 써봐야 알겠습니다.


추가 — 생각보다 빨리 끝났다

글을 쓴 직후 Anthropic이 Fable Mythos 접근 종료 공지를 올렸습니다. 22일까지 실컷 써볼 생각이었는데, 예상보다 빨리 문이 닫혔습니다. 하루 써본 것만으로도 확실히 뭔가 다르다는 느낌이 있었는데, 더 긴 시간을 두고 검증해보지 못한 게 아쉽습니다. 다음 정식 공개 때 다시 제대로 써볼 기회가 오길 기다려봐야겠습니다.