개발 slecs

이중 인코딩 방지와 정규표현식 토큰 경계 정제

목차

블로그 리뷰 자동화 스크립트의 검증 로직을 개선했다. 코드 검증 도구(codex)를 통해 발견된 두 가지 숨은 버그를 수정한 작업이다.

문제: 이중 인코딩의 악순환

URL을 검증하거나 정규화할 때, 인코딩이 중복으로 일어나는 일이 있다. 예를 들어 /api/review?param=hello world 같은 URL이 있을 때:

  1. 첫 번째 인코딩: hello worldhello%20world
  2. 두 번째 인코딩: hello%20worldhello%2520world (% 기호도 인코딩됨)

결과적으로 %2520 같은 읽기 어려운 형태가 되어, 서버에서 의도한 값을 제대로 파싱하지 못하게 된다. 이런 일은:
- 여러 라이브러리나 함수를 체이닝할 때
- 검증 단계마다 별도로 인코딩할 때
- 외부에서 받은 데이터를 다시 처리할 때

흔히 발생한다. 이번에는 블로그 검증 과정에서 URL을 처리할 때, 이미 인코딩된 특수문자를 보호하기 위해 safe='/%' 파라미터를 명시했다.

# Before: 기본 설정으로 인코딩
encoded_url = urllib.parse.quote(url)
# 문제: % 가 %25 로 재인코딩되고, / 도 인코딩되어 경로 손상

# After: 이미 안전한 문자들은 그대로 두기
encoded_url = urllib.parse.quote(url, safe='/%')
# 결과: 이중 인코딩 방지, 경로 구조 보존

safe 파라미터는 '이 문자들은 인코딩하지 말고 그대로 둬'라는 지시문이다. /를 safe로 두면 경로 구조가 유지되고, %를 두면 이미 인코딩된 부분이 또 인코딩되지 않는다.

문제: 정규표현식의 부정확한 토큰 매칭

두 번째 문제는 정규표현식에서 class 같은 키워드를 찾을 때였다. 정규표현식 class는 문자 그대로 매칭되는데, 만약 코드에 myclassclassmethod 같은 복합어가 있으면 의도하지 않은 부분도 걸린다.

# Before: 단어 경계 없이 모든 class 를 매칭
pattern = r'class'
# 문제: "myclass", "classmethod", "subclassable" 모두 걸림

# After: 단어 경계 \b 로 정확히 한정
pattern = r'\bclass\b'
# 결과: 정확히 class 라는 독립된 토큰만 매칭

정규표현식의 \b는 '단어와 비단어의 경계'를 의미한다. \bclass\b로 쓰면 class 앞뒤로 공백이나 연산자 같은 문자가 있을 때만 매칭된다. 이렇게 하면 거짓 양성(false positive)을 줄이고 정확한 검사가 가능해진다.

코드 검증과 팀의 실수 패턴

이 두 수정사항은 모두 codex를 통한 코드 검증에서 발견됐다. 검증 단계에서 몇 가지 안티패턴을 지적받은 덕분에 숨어 있던 로직 오류들을 찾아낼 수 있었다.

항목 문제 해결책
URL 인코딩 %가 중복 인코딩됨 safe='/%'로 이미 인코딩된 부분 보호
정규표현식 class가 부분 문자열도 매칭 \bclass\b로 단어 경계 명확화
영향 검증이 잘못된 데이터를 패스 정확한 검증으로 버그 조기 차단

특히 이번 경험에서:
- 인코딩 관련 버그는 겉으로 드러나기 어렵다. 대부분 특정 입력에서만 발생하기 때문
- 정규표현식도 마찬가지로, 경계 케이스(boundary case)를 테스트하지 않으면 놓치기 쉽다
- 정적 검증 도구는 이런 '일반적 실수'를 일괄적으로 잡아주므로 팀 전체에 학습 효과가 있다

비슷한 패턴을 다시 만날 때를 대비해, 코드 리뷰 체크리스트에 "URL 인코딩 단계 확인", "정규표현식 경계 명시 확인" 정도를 넣어두면 좋을 것 같다. 자동화된 검증도 좋지만, 사람의 눈으로 '왜 이렇게 했는가'를 설명하는 주석과 테스트 케이스가 있으면 더 안전하다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.