성인 인증이 필요한 상품이 있고 인증하면 원본 이미지가 보인다. 시험 케이스를 보니 인증이 풀리는 조건이 넷으로 잡혀 있었다. 넷을 나란히 놓고 보니 성격이 서로 달랐다.
Table of contents
Open Table of contents
상황 — 성격이 다른 네 조건
로그아웃과 시간 경과와 앱 재실행과 재로그인이 그 넷이었다. 로그아웃은 사용자가 명시적으로 한 행동이고 시간 경과는 저절로 일어난다.
재로그인은 애매했는데 인증을 유지하는 것도 다시 받는 것도 말이 된다. 시험 케이스의 문구만으로는 어느 쪽이 맞는지 갈리지 않았다. 이런 자리를 그대로 두면 확인하는 사람마다 다르게 판정한다.
저장 위치가 동작을 정한다
인증 결과를 MySQL에 두느냐 Android·iOS의 저장소에 두느냐에 따라 재실행 시 동작이 달라진다. 앱 쪽에 두면 지웠다 깔 때 함께 사라지고 MySQL에 두면 유지된다.
네 조건 중 셋이 이 선택으로 결정되고 있었다. 조건을 하나씩 정하는 것이 아니라 저장 위치를 정하면 대부분이 따라온다. 개별 조건을 따지기 전에 그것부터 확인해야 했다.
시간 제한과 검증 방법
시간 유효기간이 있는 이유는 기기를 다른 사람이 쓸 가능성 때문으로 보였다. 인증한 사람과 지금 쓰는 사람이 같다고 보장할 수 없다.
그런데 서버가 NOW()로 시각을 판정하면 기기 시각을 바꾸는 방법으로는 확인이 안 된다. 실제로 시간이 지나기를 기다려야 한다. 오래 걸리는 시험 케이스는 매번 돌릴 수 없어 중요도를 낮게 두게 된다.
한 화면에만 필터가 없었다
성인 상품을 걸러 내는 WHERE가 목록과 검색에는 있는데 장바구니에는 없었다. 담은 시점에 이미 한 번 봤다는 것을 전제한 것으로 보였다.
그러면 인증이 풀린 뒤에도 장바구니에서는 계속 보인다. 의도인지 빠뜨린 것인지 시험 케이스만으로는 알 수 없었다. 예외가 있으면 왜 예외인지 함께 적혀 있어야 했다.
보는 것과 사는 것의 관문
인증이 풀린 뒤에도 보이는 구간이 생기지만 결제 단계에서 다시 막고 있었다. 마지막에 확실한 관문이 하나 있는 구조였다.
관문을 한 곳에 두면 그 앞은 다소 느슨해도 된다. 다만 그 한 곳이 뚫리면 전부 뚫리므로 그 자리는 더 단단해야 한다. 어디에 관문을 둘지가 앞뒤의 엄격함을 함께 정하고 있었다.
정리
- 해제 조건이 넷이고 각각 성격이 다르다
- 재로그인은 유지와 재인증 둘 다 말이 된다
- 문구만으로 안 갈리는 자리는 판정이 사람마다 다르다
- 인증 결과를
MySQL에 두는지 앱 저장소에 두는지가 재실행 동작을 정한다 - 조건을 하나씩 정하기 전에 저장 위치를 정한다
- 서버가
NOW()로 판정하면 기기 시각으로는 확인이 안 된다 - 오래 걸리는 시험 케이스는 중요도가 낮아진다
- 관문을 한 곳에 두면 그 앞이 느슨해진다