Skip to content
isdnetworks
Go back

시작할 때 반드시 거치는 자리를 만들었다

로그인한 뒤에 확인해야 하는 것이 시간이 지나며 하나씩 늘어났다. 비밀번호 변경 주기와 약관 동의와 추가 인증이 차례로 붙었다. 화면마다 그 session 검사를 넣다 보니 새 화면에서 빠지는 일이 생겼다.

Table of contents

Open Table of contents

원인 — 빠지는 곳이 생기는 구조

session 검사를 화면마다 넣는 방식은 새 화면을 만들 때 그것을 기억해야만 유지된다. 화면을 만드는 사람이 그것을 모르면 그냥 빠져 버린다.

검사가 빠진 화면은 아무 오류도 안 내고 정상으로 동작하기 때문에 그 빠짐이 드러나는 것은 대개 한참 뒤에 다른 문제를 조사하다가 우연히 마주칠 때다. 결국 사람의 기억에 의존하는 구조가 이 문제의 원인이었다.

반드시 거치는 자리

그래서 모든 컨트롤러가 extends 하는 자리를 하나 만들고 거기서 session을 검사하게 했다. 화면을 새로 만들어도 그 자리를 지나므로 자동으로 적용된다.

기본이 검사하는 것이 되고 건너뛰려면 명시적으로 적어야 하는 구조가 됐다. 앞의 방식은 넣어야 적용되고 바꾼 방식은 빼야만 안 된다. 기본값이 어느 쪽이냐가 빠짐이 생기는지 아닌지를 정하고 있었다.

예외가 목록이 된다

건너뛰어야 하는 화면도 있는데 로그인 화면과 약관 동의 화면 자체가 그렇다. 그런 화면들은 건너뛰는 목록에 하나씩 명시적으로 적게 했다.

그러면 예외가 한자리에 모여서 그 자체로 목록이 된다. 무엇이 검사를 안 받는지를 그 목록만 보면 알 수 있다. 전에는 각 화면을 다 열어 봐야 알 수 있었던 것이 한 파일로 정리됐다.

순서와 무한 넘김

검사가 여럿이면 그중 어느 것을 먼저 볼지도 정해야 했다. 비밀번호 변경이 먼저인지 약관 동의가 먼저인지에 따라 사용자가 보는 화면이 달라진다.

그래서 순서를 정해 코드에 적고 그렇게 정한 근거도 함께 남겼다. 그리고 검사에 걸려 redirect 한 화면이 다시 그 검사에 걸리면 계속 돈다. RFC 7231은 순환하는 redirect를 클라이언트가 감지해 끊으라고 권고할 뿐이라 그것에 기대면 브라우저마다 다르게 끊긴다. 그래서 같은 자리로 다시 넘기는 경우를 서버에서 감지해 멈추게 했는데 계속 도는 것보다 멈추고 오류를 내는 편이 낫다.

모든 경로를 도는 확인

마지막으로 컨트롤러 목록을 전부 돌면서 각 화면이 그 자리를 거치는지 확인하는 것을 만들었다. 넣고 돌려 보니 그 자리를 extends 하지 않은 화면이 두 개 나왔다.

구조를 바꿔도 그것을 안 따르는 자리가 남을 수 있다. 확인을 만들지 않았으면 그 둘은 그대로 빠진 채로 남았을 것이다. 새 규칙을 한 자리에 넣으면 전 화면에 적용된다는 것도 그 확인으로 검증됐다.

정리


Share this post on:

Previous Post
값 하나를 바꾸면 여러 테이블이 같이 바뀌어야 했다
Next Post
검사 통과가 완성이 아니다