우리는 인터넷이 어떻게 작동하는지 가르치기를 멈췄다

추상화가 인터넷을 쓸 수 있게 만들었다. 불투명하게도 만들었다. 그 비용이 나쁜 보안 결정, 장애 시 무력함, 카고컬트 설정에서 나타난다.

인터넷을 안 보이게 만들어서 쓸 수 있게 만들었다.

채택에는 좋은 거래였고 이해에는 나쁜 거래였다.

대부분의 개발자가 DNS, TCP, TLS, HTTP의 명확한 멘탈 모델 없이 하루 종일 fetch() 호출을 쓸 수 있다. 대부분의 사용자가 리졸버가 뭘 하는지, 인증서 경고가 왜 중요한지, “내한테만 사이트가 안 돼”가 앱 서버에 요청이 닿기 전에 15가지 다른 것을 의미할 수 있는지 전혀 모른 채 평생 온라인에서 보낼 수 있다.

모뎀 설정을 손수 편집하던 시절의 향수가 아니다.

불투명함에 비용이 있다는 관찰이고, 청구서가 보안과 운영에서 계속 나타난다는 것이다.

추상화 스택

인터넷의 모든 레이어가 아래 레이어를 숨긴다. HTTP가 TCP를 숨긴다. TLS가 핸드셰이크를 숨긴다. DNS가 해석 체인을 숨긴다. 클라우드 서비스가 서버를 숨긴다. 프레임워크가 HTTP를 숨긴다. 그리고 맨 위에서 개발자가 fetch('/api/data')를 쓰고 작동하길 기대한다.

작동할 때 추상화는 아름답다. 생산성이 올라간다. 진입 장벽이 내려간다.

고장 나면 추상화가 벽이 된다. DNS가 뭔지 배운 적 없는 개발자가 해석 실패를 디버깅 못 한다. CORS가 뭔지 모르는 개발자가 브라우저 에러와 3시간을 싸운다. 블로그에서 TLS 설정을 복사한 개발자가 감사인이 물을 때 설정이 뭘 뜻하는지 설명 못 한다.

모르는 것의 비용

같은 패턴을 계속 본다:

아무도 디버깅 못 하는 DNS 설정 오류. 마이그레이션이 잘못된다. 사이트가 다운된다. 팀이 배포 파이프라인을 쳐다본다 — 이해하는 시스템이니까. DNS TTL이 뭘 뜻하는지, 왜 옛 레코드가 어딘가에서 아직 캐시돼 있는지 멘탈 모델이 없어서 아무도 DNS를 확인하지 않는다.

이해 없이 복사한 보안 헤더. 스캐너가 “이 헤더를 추가하세요”라고 한다. 팀이 추가한다. 하나가 — Content-Security-Policy — 사이트를 깨뜨린다. 뭘 하는지 아무도 이해 못 해서. 'unsafe-inline'을 추가해서 깨지지 않게 한다. 헤더가 존재하고 쓸모없다. 스캐너는 초록색. 보안은 연극.

미스터리로 취급되는 TLS 에러. “인증서 괜찮은데, 방금 갱신했어요.” 근데 중간 인증서가 빠졌거나. 호스트명이 안 맞거나. HSTS가 하루짜리 max-age로 설정돼 있거나. TLS는 클라우드 제공자가 처리하는 거니까 팀에서 아무도 이게 뭔 뜻인지 모른다. 처리 안 될 때까지는.

클라우드가 악화시켰다

관리형 서비스가 생산성에는 놀랍고 이해에는 끔찍하다.

버튼 클릭으로 데이터베이스를 프로비저닝하면 복제, 커넥션 풀링, 백업 검증을 배우지 않는다. DNS를 CDN이 관리하면 존 파일, 위임, TTL을 배우지 않는다.

뭔가 잘못될 때까지는 괜찮다. 그때 내부를 한 번도 본 적 없는 시스템을 “버튼을 눌렀는데 전에는 됐었다”에서 멈추는 멘탈 모델로 디버깅하게 된다.

할 수 있는 것

모두가 BGP를 이해하거나 RFC를 읽어야 한다고 주장하는 게 아니다. 하지만 기본적 멘탈 모델이 온전한 한 카테고리의 실수를 막아줄 것이다:

“DNS는 이름을 숫자로 번역하고 번역이 한동안 캐시된다” — 이 한 문장이 마이그레이션 중 DNS 혼란의 절반을 막는다.

“HTTPS는 연결을 암호화하지 사이트가 아니다. 자물쇠는 암호화를 뜻하지 신뢰할 수 있다는 게 아니다” — 피싱 사이트에 대한 잘못된 신뢰를 막는다.

“CORS는 위험할 수 있는 요청을 브라우저가 막는 것이지 서버가 고장 난 게 아니다” — 몇 시간의 혼란스러운 디버깅을 절약한다.

깊은 기술 개념이 아니다. 한 문단짜리 설명이다. 그리고 인터넷 위에서 만드는 대부분의 사람이 이것조차 갖고 있지 않다.

아이러니

인류 역사상 가장 정교한 통신 시스템을 만들었고, 그걸 쓰는 사람들 — 심지어 그 위에서 만드는 사람들 — 이 대부분 어떻게 작동하는지 모른다. 추상화가 너무 완벽히 성공해서 추상화하고 있던 지식이 사라지고 있다.

인터넷은 DNS, TCP, TLS, HTTP, BGP 위에서 돈다. 이 프로토콜은 모든 레이어를 이해하는 사람들이 설계했다. 이제 거의 아무것도 이해하지 못하는 사람들이 운영한다. 격차를 자동화, 관리형 서비스, 그리고 희망이 채운다.

작동한다. 보통은. 안 되면 아무도 어디를 봐야 하는지 멘탈 모델이 없어서 디버깅이 10배 더 오래 걸린다.

인터넷이 어떻게 작동하는지 가르치기를 일부러 멈춘 게 아니다. 알 필요를 없앤 것이다. 그리고 “불필요한”과 “중요하지 않은”을 혼동했다.

토론 참여

← 블로그로 돌아가기