Highlights
이번 주에는 request 결과에 영향을 미치는 두 가지 변경 사항이 있습니다. UTF-8이 아닌 사이트에서 response body가 깨진 문자로 수신되는 문제가 해결되었으며, validate로 허용된 non-200 response가 마침내 실패 대신 성공으로 분류됩니다. 또한 고객 API의 몇 가지 보안 취약점을 보완했습니다.
What's New
Non-UTF-8 pages return readable text on Single
불가리아 포럼, 중국 이커머스, 일본 뉴스 또는 windows-1251, GBK, Big5, Shift_JIS를 사용하는 사이트에서 Single을 호출할 때, 기존에는 response body가 깨진 바이트로 반환되었습니다. 내부 HTTP 레이어에 UTF-8 디코더가 하드코딩되어 있어 키릴 자모 페이지가 промоции와 같이 수신되었으며, 사용자 측에서는 원본을 복구할 방법이 없었습니다.
이 문제는 request 레이어에서 해결되었습니다. 이제 Single은 소스 캐릭터셋(Content-Type header, <meta charset>, <meta http-equiv> 순으로 확인)을 감지하고, body가 JSON 엔벨로프에 도달하기 전에 UTF-8로 변환합니다. UTF-8 또는 ASCII 페이지는 변경 없이 그대로 통과합니다. 이미지나 PDF 같은 바이너리 콘텐츠는 디코딩되지 않습니다. 원본 바이트를 원하시는 경우, returnBuffer: true를 사용하면 기존처럼 원본 버퍼를 그대로 반환합니다.
기본으로 활성화됩니다. 별도의 플래그를 설정할 필요가 없습니다. 기존에 정상적으로 작동하던 페이지는 그대로 작동하며, 깨진 텍스트를 반환하던 페이지는 이제 읽을 수 있는 텍스트를 반환합니다. 브라우저 사용자도 이를 신경 쓸 필요가 없습니다. Chromium이 자체적으로 캐릭터셋을 디코딩하기 때문입니다.
validate rules now drive success classification
request에 validate를 설정하면(예: validate.status.accept = [200, 403]), request 엔진은 이미 해당 규칙을 준수하여 에러 없이 response를 처리했습니다. 하지만 업스트림의 outcome 분류기는 이 규칙을 무시하고 200이 아닌 모든 결과를 application_fail로 분류했습니다. 이로 인해 두 가지 문제가 발생했습니다. 허용된 403 결과가 대시보드에 실패로 표시되었고, 성공한 건에 대해서만 비용이 청구되므로 해당 response들은 청구에서 누락되었습니다.
이제 분류기는 validate에 선언된 내용을 존중합니다. validate가 설정된 request는 상태 코드에 관계없이 엔진이 에러 없이 처리했다면 성공으로 간주됩니다. validate가 없는 request는 이전과 동일하게 작동하므로(200인 경우에만 성공), 기존 로직은 그대로 유지됩니다.
신규 데이터에만 적용되는 수정 사항입니다. 기존 이력 데이터는 저장된 outcome을 유지하며, 신규 request부터 올바르게 분류됩니다. 따라서 유효한 response임에도 App Fail로 표시되는 현상을 겪으셨다면, 이 변경 사항으로 해결됩니다.
Security hardening on the customer API
고객 API 전반에 걸친 보안 검토의 Wave 0 단계를 배포했습니다:
- CORS가 이제
https://foura.ai로 제한됩니다. 이전 설정은 자격 증명(credentials)을 전송할 때 모든 origin을 허용하는 표준 CSRF 취약점 구성을 가지고 있었습니다. 동일 출처(same-origin) 브라우저 호출 및 서버 측 API 호출은 영향을 받지 않습니다. - 활동 타임라인 뒤에서 작동하는 metrics route가 이전에는 쿼리로 직접 전달되는 자유 형식의
outcome필터를 허용했습니다. 이제는 알려진 outcome 값만 허용하도록 화이트리스트 처리되었습니다. 일반 계정에서는 악용할 수 없는 취약점이었으나, 사전에 보완하는 것이 안전합니다.
두 변경 사항 모두 API 규격을 변경하지 않습니다. 일반적인 사용 중에는 변화를 느끼지 못하실 것입니다. 하지만 문제가 발생하기 전에 취약점을 찾아 해결한 만큼, 이를 투명하게 공유하고자 합니다.
Activity labels match the Overview
사소한 변경 사항입니다. 이전에는 대시보드의 Activity 테이블에 Application_fail과 같은 원시 outcome 문자열이 표시되었던 반면, Overview 칩, 도넛 차트, 타임라인에는 친숙한 레이블(App Fail)과 색상 코드가 적용되어 표시되었습니다. 동일한 데이터가 두 가지 방식으로 표현되었던 것입니다. 이제 이 두 화면이 동기화되어 동일한 레이블 및 색상 맵을 참조하므로, 어디서 확인하든 동일한 상태로 표시됩니다.
Numbers
이번 주에는 새로운 지연 시간(latency)이나 성공률(success-rate) 수치가 없습니다. 이번 작업의 대부분은 '더 빠르게'보다는 '오류를 방지하는 것'이 올바른 지표인 정확성 및 보안 강화 작업이었습니다. 다음 주 다이제스트에는 현재 진행 중인 몇 가지 작업의 처리량(throughput) 데이터가 포함될 예정입니다.