특수문자를 쓸 수 있냐는 문의가 자주 와서 검증 서비스의 허용 목록을 보고 답했다. 콤마가 된다고 답했는데 실제로는 안 됐다.
Table of contents
Open Table of contents
한 목록만 보고 답한 결과
내가 본 것은 허용 문자를 나열한 목록이었고 거기에 콤마가 들어 있었다. 그 목록이 최종 판정이라고 전제한 것이 틀렸다.
한 곳만 보고 답하면 그 답이 맞는지 틀리는지도 알 수 없다. 통과 여부를 정하는 자리가 몇 개인지부터 확인했어야 했다.
앞에 있던 다른 검증
요청 클래스를 열어 보니 그 앞에 별도 규칙 클래스가 붙어 있었다. 그 클래스는 금지 문자를 나열하는 방식이었고 거기에 콤마가 있었다.
요청은 두 단계를 순서대로 지난다. 앞의 금지 목록을 통과하고 뒤의 허용 목록에도 들어야 저장까지 간다.
성격이 정반대인 두 레이어
앞은 적혀 있으면 차단하고 뒤는 적혀 있어야 통과한다. 방식이 정반대라 한쪽 목록만 보면 반대 방향으로 틀린 답이 나온다.
실제로 어긋나는 것이 양쪽에 있었다. 뒤에서는 허용인데 앞에서 막히는 문자가 있고 앞은 통과인데 뒤의 목록에 없어서 막히는 문자도 있었다.
최종 허용은 교집합이다
최종 허용 문자는 앞의 금지 목록에 없으면서 뒤의 허용 목록에 있는 것이었다. 그래서 문자별로 앞의 판정과 뒤의 판정과 최종 결과를 세 칸으로 나눈 표를 만들었다.
두 칸만 있으면 되는지 안 되는지는 알아도 왜 안 되는지를 말할 수 없다. 어느 레이어에서 막혔는지가 세 번째 칸에서 나온다.
조건부 생략과 영역별 규칙
여기에 예외가 하나 더 있었는데 특정 조건에서는 앞의 검증이 통째로 생략됐다. 그러면 앞에서 막히던 문자가 그 경로에서만 허용되므로 같은 문자가 조건에 따라 되기도 안 되기도 한다.
영역마다 붙는 규칙도 달라서 어떤 필드에서는 허용되는 문자가 다른 필드에서는 금지였다. 규칙 클래스만 읽으면 그것이 어느 필드에 붙는지 모르므로 등록 지점까지 봐야 표가 완성됐다.
정리
- 검증 레이어가 둘 이상일 수 있다
- 한 곳만 보고 답하면 그 답의 진위도 알 수 없다
- 성격이 반대인 두 레이어면 한쪽만 보고 답하면 틀린다
- 최종 허용은 두 판정의 교집합이다
- 어긋나는 문자가 양방향으로 있다
- 표에 각 레이어의 판정과 최종을 나눠 적어야 이유가 나온다
- 조건에 따라 한 레이어가 통째로 생략될 수 있다
- 규칙 클래스만 보지 말고 등록 지점까지 본다