개인 서버를 챗봇에 붙이면서 읽는 도구는 넓게 열었다고 썼다. 그중 제일 손이 많이 간 게 메일이다.
메일 계정이 역할별로 갈라져 있다. 명세서가 오는 곳과 세금계산서가 오는 곳이 다르고, 그 밖의 연락이 오는 곳이 또 다르다. 나눠둔 이유가 있어서 합칠 생각은 없는데, 뭘 찾을 때마다 계정을 바꿔가며 뒤지는 게 일이었다. 그러다 놓친다.
다 붙이는 게 무서웠다
계정을 프로그램에 물리는 건 어렵지 않다. 망설인 건 다른 부분이었다. 메일 권한을 넓게 주면 잘못 돌았을 때 메일이 나가거나 지워진다. 받은 편지함은 되돌릴 수 있는 곳이 아니다.
그래서 인증 단계에서부터 조회 권한만 요청했다. 계정마다 읽기 전용 범위로만 승인을 받는다. 이렇게 하면 코드가 어떻게 잘못 돌든 전송이나 삭제가 물리적으로 안 된다. 코드를 조심하는 것과, 애초에 못 하게 막아두는 것은 다르다.
그 위에 도구도 조회 계열만 만들었다. 최근 메일 보기, 검색, 본문 열기, 첨부 가져오기. 전송·삭제·라벨 변경은 만들지 않았다. 안 만든 기능은 잘못 불릴 일이 없다.
읽음 처리를 하지 않는다
작지만 중요하게 챙긴 게 이거다. 프로그램이 메일을 훑으면서 읽음 표시를 남기면, 내가 아직 안 본 메일이 읽은 것처럼 보인다. 자동화가 사람의 판단 근거를 조용히 바꿔버리는 셈이다.
그래서 읽지 않음 여부는 메일에 붙은 라벨을 보고 판정만 하고, 그 상태를 건드리지 않는다. 프로그램이 백 번을 훑어도 받은 편지함은 내가 놔둔 그대로다.
어디서 온 메일인지 보이게
통합해놓고 보니 새로 생기는 문제가 있었다. 결과가 한 덩어리로 나오면 이게 어느 계정으로 온 메일인지 알 수가 없다. 명세서를 찾았는데 그게 어느 쪽으로 온 건지 모르면 다음에 또 못 찾는다.
그래서 조회 결과마다 계정 라벨을 붙였다. 계정 이름 그대로가 아니라 역할을 나타내는 짧은 이름이다. 통합의 목적이 "한 번에 본다"이지 "출처를 지운다"가 아니어서다.
인증 토큰은 계정별로 캐시해 두고 만료 전에만 다시 받는다. 조회할 때마다 인증을 새로 하면 느리기도 하고 호출도 낭비다.
정리
권한을 좁게 잡으면 사고가 나도 범위가 "읽는 것"에서 끝난다. 이게 마음이 제일 편한 부분이다. 프로그램이 오작동해도, 챗봇이 엉뚱한 판단을 해도, 최악의 경우가 "안 봐도 될 메일을 봤다"다.
기능을 안 만드는 것도 설계다. 나중에 정말 필요해지면 그때 만들면 되고, 그때는 지금보다 더 신중하게 만들 것이다. 반대 방향은 되돌리기 어렵다.