기대던 서비스가 사라지면
거기 기댄 코드가 전부 드러납니다.
외부 인증 서비스의 프로젝트가 없어졌습니다. 하루 만에 자체 인증으로 갈아탔고, 7일 뒤에 옮겨지지 않은 자리 둘을 찾았습니다. 갈아타는 것보다 다 갈아탔는지 아는 것이 어려웠습니다 — 그 기록입니다.
하루에 두 커밋으로 끝났습니다
지운 줄이 더한 줄보다 많습니다. 외부 서비스에 맞추느라 있던 코드가 그만큼이었다는 뜻입니다. 세션 관리·토큰 갱신·상태 동기화 — 직접 하면 훨씬 적게 듭니다. 물론 그건 이 규모에서 그렇습니다.
서명 쿠키 하나와 서버측 검증 하나. 로그인·로그아웃·현재 사용자, 엔드포인트 셋. 필요한 것이 그것뿐이었습니다 — 처음부터 그렇게 만들 수 있었는지는 다른 질문입니다.
문을 먼저 잠그고 자물쇠를 바꿨습니다
같은 날 두 커밋의 순서가 중요합니다. 먼저 쓰기 API 에 인증 게이트를 걸었고, 그다음 인증 방식을 바꿨습니다.
반대로 했으면 그 사이에 인증이 없는 시간이 생깁니다. 외부 서비스가 이미 죽어 있으므로 「기존 인증이 아직 살아 있다」는 가정이 성립하지 않습니다 — 죽은 자물쇠는 잠근 것이 아닙니다.
갈아타는 작업에서 가장 위험한 시간은 「옛것을 떼고 새것을 붙이기 전」입니다. 그 시간을 0으로 만들려면 먼저 막고 나서 바꿉니다.
7일 뒤에 옮겨지지 않은 둘을 찾았습니다
인증 문맥(context)은 옮겼는데 그것을 쓰지 않고 직접 호출하던 페이지 둘이 남았습니다. 사라진 서비스에 「지금 누가 로그인했나」를 묻고, 답이 없으니 이름 자리가 빈 채로 화면이 떴습니다.
아무도 그 페이지를 안 가리키고 있었습니다. 링크가 없으니 쓰는 사람도 없고, 깨진 것을 말해줄 사람도 없었습니다. 고아 페이지는 조용히 깨진 채로 남습니다.
왜 7일이나 걸렸나 — 찾을 이유가 없었기 때문입니다. 오류도 안 나고, 아무도 안 들어가고, 검사도 없었습니다. 발견은 다른 일을 하다가 옆에서 나왔습니다.
「고쳤다」가 어디까지인지 적습니다
비로그인 접근을 로그인 화면으로 보내도록 한 줄을 넣었습니다. 확인해보니 절반만 고쳐졌습니다.
그 리다이렉트는 브라우저가 화면을 살린 뒤에 일어납니다. 서버는 여전히 같은 HTML 을 내보냅니다. 사람은 막혔고 기계는 안 막혔습니다.
서버측으로 막으려면 요청마다 도는 코드를 건드려야 하고, 그건 다른 판단이 필요한 일입니다. 지금은 여기까지 했다고 적습니다 — 「고쳤다」를 범위 없이 적으면 다음 사람이 다 막힌 줄 압니다.
갈아타는 것보다 다 갈아탔는지 아는 것이 어렵습니다
교체 자체는 하루였습니다. 남은 자리를 찾는 데 7일이 걸렸고, 그것도 우연히 찾았습니다. 차이는 «찾는 방법이 있었는가» 입니다.
외부 의존을 걷어낼 때 세 가지를 같이 하면 이 간격이 줄어듭니다 — 먼저 막고 나서 바꾸고, 옛 호출이 남았는지 세는 방법을 만들고, 아무도 안 가리키는 페이지를 목록으로 뽑아둡니다. 마지막이 제일 자주 빠집니다. 링크가 없는 페이지는 있다는 사실 자체가 잊히기 때문입니다.