03딜리버리

방화벽을 푸는 대신 나갈 것만 따로 짓다

화면 하나를 밖에서 쓰겠다는 요청이었는데, 그 화면이 사내 화면들과 같은 번들에 있었습니다. 접근을 여는 대신 나갈 것만 따로 지었습니다.

역할 · 배포 경계 설계 및 구현

밖으로 내보낸 화면 전부입니다. 산정 결과와 근거 자료의 자리만 서 있고, 남의 수치도 사내 화면도 여기에 없습니다.

이 화면이 하는 일

Starzip 은 지역 상점이 자기 상점 이름으로 토큰을 발행하는 제품입니다. 발행에 앞서 상점이 얼마짜리인지 한 번 가늠해야 하는데, 카페나 식당 주인에게는 그 숫자를 낼 방법이 마땅치 않습니다. 감정을 의뢰하면 비용과 시간이 들고, 발행할지 말지를 아직 정하지 않은 사람이 그 비용을 먼저 치르지는 않습니다.

그래서 이 화면은 주인이 직접 재 보는 자기진단 도구입니다. 한 가지 방법으로만 계산하고 우리가 가중치를 얹지 않습니다. 값에 손을 대는 순간 그것은 상점의 값이 아니라 우리 판정이 되기 때문입니다. 이 화면을 여는 사람은 아직 제품에 들어오지 않은 상점이고, 그 상점을 만나는 것은 우리가 아니라 파트너입니다. 밖으로 나가야 했던 이유가 여기 있습니다.

문제

상점 가치를 산정하는 화면을 회사 밖에서 쓰고 파트너에게 링크로 넘기겠다는 요청이 왔습니다.

그때 이 화면은 사내망 안에만 있었습니다. 밖으로 내려면 그 화면만 따로 지어야 했습니다. 화면 코드가 번들 하나에 전부 들어 있어서, 주소만 열면 나갈 이유가 없는 화면까지 같이 나갑니다.

접근 권한을 화면 단위로 잘게 나누는 길도 있었습니다. 그러나 나가야 하는 것이 화면 하나일 때 그 길은 지켜야 할 규칙을 늘립니다. 늘어난 규칙은 화면이 늘 때마다 다시 지켜져야 하고, 안 지켜졌다는 사실은 사고가 나야 드러납니다.

판단: 나갈 것만 따로 지었습니다

소스는 그대로 함께 두고 배포 산출물만 갈랐습니다. 밖으로 나갈 화면만 부르는 축소 라우터를 두고, 그 라우터로 따로 빌드합니다.

  • 부르지 않는 화면은 번들에 실리지 않습니다. 그래서 무엇을 부르는지 적은 파일 하나가 곧 노출 범위의 정의가 됩니다. 규칙이 아니라 산출물이 경계라서, 지켜지고 있는지 확인할 일이 생기지 않습니다
  • 처음 나온 산출물은 136MB였습니다. 빌드 도구가 정적 자산 폴더를 통째로 복사해서 내부 자산까지 딸려 나갔기 때문입니다. 전용 폴더로 갈라 실제로 쓰는 파일만 남기니 1.8MB가 됐습니다
  • 사내 개발 도구도 뺐습니다. 화면을 갈아 끼우는 스위처와 내부 문서로 가는 링크는 밖에서 보이면 안 됩니다
  • 확인은 눈으로 하지 않았습니다. 빌드한 것을 실제로 띄워 놓고 내부 경로들을 하나씩 열어, 전부 이 화면으로 떨어지는지 응답을 대조했습니다. 내부 자산은 산출물에 아예 없습니다

하지 않기로 한 것

검색 차단 파일을 두지 않았습니다. 요구사항에 한 번 넣었다가 도로 뺐습니다.

크롤링을 막는 것과 색인을 막는 것은 다른 일입니다. 크롤링을 막으면 로봇이 페이지를 아예 읽지 않고, 그러면 문서 안에 이미 들어 있는 색인 차단 표시를 못 봅니다. 그 상태에서 밖에 링크가 걸리면 내용 없이 주소만 검색 결과에 오를 수 있습니다. 막으려던 것보다 나쁜 자리입니다. 표시 하나만 두는 쪽이 안전합니다.

비밀번호도 걸지 않았습니다. 용도가 파트너에게 링크로 넘기는 것이라, 비밀번호를 걸면 그 비밀번호가 링크와 같은 자리에 함께 전달됩니다. 그러면 지키는 것처럼 보이기만 하고 실제로 지키지는 않습니다. 대신 검색으로 흘러들어오는 경로를 닫고, 제품 어디에도 이 주소로 가는 링크를 두지 않기로 했습니다.

밖에 나가면 같은 문장이 다른 자리에 섭니다

방화벽 뒤에 있는 동안 이 화면의 문구는 노출이 아니었습니다. 주소가 밖으로 나가는 순간 같은 문장이 회사 밖의 판단 근거가 되는 자리로 옮겨갑니다. 그래서 문구를 함께 손봤습니다.

  • 결과 화면 각주가 스스로를 판단의 참고 자료라고 말하고 있었습니다. 그 문장을 걷었습니다. 화면이 무엇을 주장하지 않는지는 무엇을 주장하는지만큼 정해 두어야 하는 것입니다
  • 눌리지 않는 버튼 하나를 걷었습니다. 저장도 서버도 없이 수치만 보여 주는 화면에 동작하지 않는 버튼을 세워 둘 이유가 없습니다
  • 임시저장 버튼도 걷었습니다. 값은 이미 자동으로 저장되고 있어서 그 버튼이 하는 일이 없었습니다. 버튼으로 두면 누르지 않으면 저장되지 않는 것으로 읽히고, 밖에서 보는 사람에게는 서버에 보관된다는 뜻으로 읽힙니다
  • 마지막 것은 내부 검수 화면도 같이 바꿨습니다. 검수하는 화면과 파트너가 보는 화면이 갈리면, 갈린 쪽은 아무도 보지 않습니다

입력값은 서버로 보내지 않고 브라우저에만 둡니다. 남는 기간은 마지막으로 손댄 때부터 셉니다. 처음 입력한 때부터 세면, 자료를 이틀에 걸쳐 모아 넣는 사람이 작업 도중에 값을 잃습니다.

결과

화면 하나가 사내망 밖에서 열리고, 같은 번들에 있던 나머지는 그 주소에 존재하지 않습니다. 경계가 규칙이 아니라 산출물이라 시간이 지나도 흐려지지 않습니다.

정하지 못한 것도 적어 둡니다. 회사가 만든 도구가 값을 산출해 공개된 주소에서 제시하는 행위가 밖에서 어떻게 읽히는지는 제가 정할 수 있는 것이 아니었습니다. 화면이 무슨 말을 하는지와 어떤 조건으로 여는지까지가 제 몫입니다. 그 행위의 성격은 판단할 사람에게 넘겼고, 넘긴 채로 배포를 막지는 않았습니다. 대신 밖으로 나가는 시점을 그 판단을 앞당길 사유로 세웠습니다.

방화벽만 풀면 한 번들 가치평가 콘솔 관리자 내부 문서 화면 하나를 열려고 했는데 상자가 열립니다 호스트를 여는 것이 곧 안에 든 것을 전부 여는 것입니다 나갈 것만 따로 지으면 밖으로 나가는 산출물 가치평가 콘솔 관리자 내부 문서 산출물에 존재하지 않습니다 무엇을 부르는지 적은 파일 하나가 노출 범위의 정의입니다 경계가 규칙이 아니라 산출물이라 지켜지는지 확인할 일이 없습니다
방화벽만 풀면 한 덩어리가 통째로 열립니다. 부르지 않는 화면은 산출물에 실리지 않으므로, 무엇을 부르는지 적은 파일이 곧 노출 범위의 정의가 됩니다.