Skip to content
[013]2026.05.31log

4시간마다 조용히 죽는 연결

성공한 척하는 실패에 대하여

깨달음: "소리 내며 부서지는 고장은 고칠 수 있다. 무서운 건 성공한 척하는 고장이다."


스택튜브의 노트는 다섯 갈래로 배달된다. 이메일, 구글 드라이브, 드롭박스, 킨들, 옵시디언. 사용자가 어디서 읽고 싶은지에 따라 골라 연결한다. 이 다섯 갈래를 하나씩 만들 때마다 "연결됨"이라는 초록 표시를 띄웠고, 나는 그 초록색을 믿고 있었다.

론칭 전 점검으로 이 연동 코드 전체를 AI에게 검토시켰다. 결과 목록의 첫 줄이 이랬다.

"드롭박스 연결은 약 4시간 후부터 모든 업로드가 실패합니다. 그리고 그 실패는 어디에도 보고되지 않습니다."

내용은 이렇다. 드롭박스에 연결하면 열쇠를 받는다. 그런데 이 열쇠는 4시간짜리다. 4시간이 지나면 새 열쇠로 바꿔야 하는데, 바꿔주는 코드가 없었다. 연결 직후에는 모든 게 정상이다. 테스트도 통과한다. 사용자도 만족한다. 그리고 4시간 뒤, 열쇠가 만료되고, 그 후의 모든 배달은 실패한다.

여기까지면 평범한 버그다. 진짜 문제는 그다음 문장이었다. 실패가 보고되지 않는다. 배달이 실패해도 시스템은 에러를 올리지 않고 조용히 다음 일로 넘어가게 돼 있었다. 사용자 화면의 표시는 여전히 "연결됨". 초록색이었다.

상상해봤다. 어떤 사용자가 드롭박스를 연결하고, 처음 몇 개의 노트가 잘 도착하는 걸 확인하고, 안심하고 잊는다. 그날 오후부터 노트는 도착하지 않는다. 일주일 뒤에 폴더를 열어본 사용자는 무엇을 할까. 문의를 보낼까? 아닐 것이다. 대부분은 "뭔가 이상하네" 하고 조용히 떠난다. 시스템도 조용하고, 사용자도 조용하다. 나만 모른다.

같은 검토에서 비슷한 부류의 문제가 몇 개 더 나왔다. 작은따옴표가 들어간 영어 제목 — 예컨대 Don't로 시작하는 영상 — 이 드라이브 검색을 깨뜨려서 같은 노트가 중복 업로드되던 버그. 노트를 삭제하면 보관함으로 옮겨주는 기능이, 찾는 파일명과 실제 파일명이 달라서 아무것도 옮기지 않고 "완료"라고 답하던 버그. 전부 한 가족이다. 실패했는데, 실패했다고 말하지 않는 것들.

수정은 사흘이 걸리지 않았다. 열쇠 갱신 코드를 넣고, 실패하면 한 번 다시 시도하게 하고, 침묵하던 자리마다 알림을 달았다. 이제 배달이 실패하면 내 슬랙으로 경고가 온다.

이 사건 이후로 내 점검 질문이 하나 늘었다. 전에는 "이 기능이 작동하나?"만 물었다. 지금은 하나 더 묻는다. "이 기능이 실패하면, 나는 그걸 어떻게 알게 되나?"

두 번째 질문에 답이 없는 기능은, 작동하는 게 아니라 아직 실패할 시간이 안 된 것뿐이다. 4시간짜리 열쇠는 어디에나 있다. 그걸 알게 된 것이 이번 수선의 가장 큰 수확이었다.


🔧 이 에피소드의 기술 용어 해설

액세스 토큰 / 리프레시 토큰 (Access / Refresh Token) 외부 서비스에 접근할 때 쓰는 열쇠. 액세스 토큰은 수명이 짧고(드롭박스는 4시간), 만료되면 리프레시 토큰으로 새 열쇠를 발급받아야 한다. 이번 사건은 그 "재발급 코드"가 없었던 것.

401 (Unauthorized) "열쇠가 유효하지 않다"는 응답 코드. 이 응답을 받았을 때 재발급을 시도하느냐, 조용히 넘어가느냐가 이번 에피소드의 갈림길이었다.

무음 실패 (Silent Failure) 실패를 보고하지 않는 실패. EP.11의 백지 책과 같은 가족이다. 다른 점은, 이번 것은 시간이 지나야 발병한다는 것.

옵저버빌리티 (Observability) 시스템이 지금 어떤 상태인지 밖에서 알 수 있는 정도. 로그, 알림, 모니터링이 그 도구다. "실패하면 어떻게 알게 되나?"라는 질문이 이것이다.