곁에 두는 참고 노트
용어 노트 비슷한 말 사이의 경계
이 용어 노트는 사전 전체를 대신하지 않는다. 책에서 서로 혼동하기 쉬운 말을 짝지어 정리했다. 정의를 외우기보다 실제로 무엇을 관찰하거나 바꾸는 말인지 떠올려 보자. 짧은 풀이만으로 제품별 동작을 단정하지 말고 관련 장과 공식 문서를 함께 읽는다.
표현과 실행
비트와 바이트. 비트는 두 상태를 구분하는 정보 단위이고 바이트는 여덟 비트다. 회선 속도와 파일 크기를 비교할 때 단위를 맞춘다. b와 B의 차이를 생략하면 전송 시간 계산이 크게 달라진다.
MB와 MiB. MB를 십진 단위로 쓰면 백만 바이트, MiB는 1,048,576바이트다. 도구가 어떤 단위 체계를 사용하는지 확인한다. 같은 크기가 다른 숫자로 표시된다고 데이터가 사라진 것은 아니다.
문자 인코딩과 글꼴. 인코딩은 문자를 바이트로 표현하는 규칙이고 글꼴은 표시할 모양에 관여한다. 깨진 문자열과 마음에 들지 않는 글자 모양은 다른 문제다. 폰트를 바꿔도 잘못 해석한 바이트가 복구되지는 않는다.
코드 포인트와 보이는 문자. 코드 포인트는 유니코드의 번호이며 사람이 보는 한 문자가 여러 코드 포인트로 이루어질 수 있다. 입력 길이 제한과 커서 이동, 문자열 자르기에서 이 차이가 드러난다.
프로그램과 프로세스. 프로그램은 실행할 명령과 자료이고 프로세스는 실행 중인 상태다. 설치된 파일이 있다는 사실과 서비스가 실행 중이라는 사실을 나눈다. 한 프로그램에서 여러 프로세스가 생길 수 있다.
동시성과 병렬성. 동시성은 여러 일을 겹쳐 진행하도록 구성하는 것이고 병렬성은 실제로 같은 시간에 여러 일을 실행하는 성질이다. 기다림이 많은 작업과 계산이 많은 작업은 서로 다른 이익을 얻는다.
컴파일과 실행 환경. 소스 코드를 변환하는 단계와 결과를 실행하는 데 필요한 환경을 구분한다. 같은 소스라도 라이브러리와 운영체제, CPU 구조, 설정이 다르면 동작이 달라질 수 있다.
해시와 암호화. 해시는 입력을 요약해 동일성 확인 등에 활용하고 암호화는 키로 내용을 보호하는 가역적인 체계다. 비밀번호 저장에는 일반 파일 검증용 빠른 해시와 다른 고려가 필요하다.
연결과 주소
MAC 주소와 IP 주소. MAC은 링크 계층 전달에서, IP는 네트워크 사이의 전달에서 사용한다. 외부 서버로 보낼 때 로컬 프레임의 목적지는 게이트웨이일 수 있다. 두 주소가 가리키는 범위를 구분한다.
스위치와 라우터. 기본적으로 스위치는 같은 링크 영역에서 프레임을 전달하고 라우터는 IP 경로를 선택한다. 실제 장비는 여러 기능을 결합할 수 있다. 장비 상자의 이름만으로 동작을 판단하지 않는다.
서브넷과 VLAN. 서브넷은 IP 주소 범위의 구분이고 VLAN은 링크 계층의 논리적 영역 구분이다. 함께 설계되는 경우가 많지만 같은 개념은 아니다. VLAN 사이의 통신에는 별도의 경로와 정책이 관여한다.
게이트웨이와 기본 경로. 게이트웨이는 다음 네트워크로 전달할 지점으로 쓰이며 기본 경로는 더 구체적인 경로가 없을 때 사용하는 경로다. 특정 목적지에는 기본 경로보다 구체적인 VPN 경로가 적용될 수 있다.
사설 주소와 루프백. 사설 주소는 내부 네트워크에서 사용할 수 있는 예약 범위이고 루프백은 같은 장치 안의 통신에 쓰인다. 사설 주소로 바인딩한 서비스가 무조건 외부에 노출되지 않는다고 보장할 수는 없다.
공개 주소와 접근 허용. 공개적으로 라우팅 가능한 주소라는 성질과 방화벽이 요청을 허용한다는 정책은 다르다. 공개 주소를 가진 서버도 필요한 포트만 허용할 수 있다. 주소만으로 권한을 판단하지 않는다.
ARP와 이웃 탐색. ARP는 IPv4의 로컬 주소 대응에 쓰이고 IPv6 이웃 탐색은 ICMPv6를 기반으로 여러 기능을 제공한다. IPv6에 IPv4 ARP 명령의 기대를 그대로 적용하지 않는다.
MTU와 MSS. MTU는 링크에서 다룰 IP 패킷 크기와 관련되고 TCP MSS는 세그먼트에 담을 TCP 데이터 크기와 관련된다. 헤더와 터널 때문에 관계가 달라질 수 있으므로 같은 숫자라고 생각하지 않는다.
홉 제한과 DNS TTL. 홉 제한은 IP 패킷이 경로에서 무한히 돌지 않도록 전달 횟수를 제한하는 데 관련된다. DNS TTL은 캐시 유지 시간과 관련된다. 같은 TTL이라는 표현이 다른 문맥에서 다른 역할을 한다.
DHCP와 DNS. DHCP는 주소와 네트워크 설정을 배정하는 데, DNS는 이름과 레코드를 조회하는 데 쓰인다. 둘이 같은 공유기에서 제공되어도 실패 원인과 확인 방법은 다르다.
NAT와 방화벽. NAT는 주소 정보를 변환하고 방화벽은 통신 허용 정책을 적용한다. 한 장비에서 함께 동작해도 역할은 다르다. NAT 뒤에 있다는 사실만으로 장치와 계정의 보안을 맡길 수 없다.
대역폭과 처리량. 대역폭은 경로의 용량을 나타내는 문맥에서 쓰이고 처리량은 실제로 전달하거나 처리한 양을 나타낸다. 프로토콜 비용과 공유, 손실, 저장 장치 때문에 실제 값은 광고 속도와 다를 수 있다.
지연과 지터. 지연은 전달이나 응답까지 기다리는 시간이고 지터는 지연의 변동과 관련된다. 평균 지연이 낮아도 순간적인 변동이 크면 음성이나 영상의 체감 품질이 나빠질 수 있다.
웹과 데이터
TCP와 UDP. TCP는 순서 있는 신뢰성 있는 바이트 스트림을 제공하고 UDP는 데이터그램을 전달한다. UDP 위의 프로토콜이 신뢰성 기능을 구현할 수 있으므로 UDP라는 이유만으로 응용 결과의 신뢰성을 판단하지 않는다.
포트와 소켓. 포트는 전송 계층의 끝점을 구별하는 번호이고 소켓은 운영체제의 통신 인터페이스 또는 끝점과 관련된 개념이다. 같은 포트 번호도 주소와 프로토콜, 연결의 상대에 따라 의미가 달라진다.
연결 거절과 시간 초과. 거절은 명시적인 거부 응답의 단서이고 시간 초과는 정해진 시간에 필요한 결과가 없었다는 뜻이다. 시간 초과만으로 어느 장비에서 버렸는지 확정할 수 없다.
HTTP와 HTML. HTTP는 요청과 응답의 의미를 정하는 프로토콜이고 HTML은 웹 문서를 표현하는 형식이다. HTTP로 JSON과 이미지도 전달한다. 화면 오류를 조사할 때 문서와 전달 과정을 구분한다.
안전한 메서드와 멱등성. 안전성은 사용자가 요청한 상태 변경을 의도하지 않는 의미이고 멱등성은 반복 요청의 의도한 효과가 한 번과 같은 성질이다. 부수적인 로그나 응답 코드까지 모두 같아야 한다는 뜻은 아니다.
쿠키와 세션. 쿠키는 브라우저가 조건에 맞는 요청에 포함하는 데이터이고 세션은 여러 요청에 걸친 상태 관리와 관련된다. 쿠키가 세션 식별자를 담을 수 있지만 두 단어가 같은 것은 아니다.
인증과 인가. 인증은 주체를 확인하고 인가는 자원에 대한 행동을 허용할지 판단한다. 로그인한 사용자가 다른 사람의 자료를 볼 권한까지 얻는 것은 아니다. 서버에서 자원별 검사가 필요하다.
TLS와 인증서. TLS는 보안 통신 프로토콜이고 인증서는 상대 이름과 공개키 등을 검증하는 데 쓰인다. 인증서가 유효하다고 사이트의 사업 내용과 주장이 사실이라는 뜻은 아니다.
공개키와 비밀키. 공개키는 공유 가능한 정보이고 대응하는 비밀키는 보호해야 한다. 서버 인증서와 비밀키를 같은 종류의 공개 파일로 취급하지 않는다. 유출 시 교체와 영향 조사가 필요하다.
no-cache와 no-store. 전자는 재사용 전 검증과 관련되고 후자는 저장하지 않도록 지시하는 정책이다. 단어의 일상적인 인상만으로 해석하지 않는다. 민감한 응답에는 전체 저장 경로를 함께 검토한다.
역방향 프록시와 CDN. 역방향 프록시는 서비스 앞에서 요청을 받아 내부로 전달하는 역할이고 CDN은 여러 위치에서 콘텐츠 전달을 돕는 분산 서비스 구조다. CDN이 프록시와 캐시 역할을 함께 수행할 수 있다.
트랜잭션과 백업. 트랜잭션은 실행 중 데이터 변경의 논리적 단위를 관리하고 백업은 나중의 복구를 위한 사본과 절차다. 트랜잭션이 있다고 실수로 삭제한 자료를 언제든 복원할 수 있는 것은 아니다.
인덱스와 캐시. 인덱스는 검색을 돕는 데이터 구조이고 캐시는 결과나 데이터를 재사용하기 위한 복사본이다. 둘 다 읽기를 빠르게 할 수 있지만 유지 비용과 무효화 방식이 다르다.
복제와 복원. 복제는 다른 곳에 상태를 이어서 반영하는 과정이고 복원은 보존한 자료로 사용 가능한 상태를 되살리는 작업이다. 잘못된 삭제가 복제될 수 있으므로 복제본을 백업의 완전한 대체물로 보지 않는다.
큐와 작업자. 큐는 처리할 일을 보관하고 전달하는 데 쓰이며 작업자는 그 일을 실행한다. 큐에 들어갔다는 사실과 결과가 완성됐다는 사실은 다르다. 실패와 재전달, 중복 처리를 함께 설계한다.
배포와 운영
이미지와 컨테이너. 이미지는 실행할 바탕 파일이고 컨테이너는 실행 인스턴스다. 실행 중 컨테이너를 손으로 고쳤다고 이미지 제작 과정까지 바뀌는 것은 아니다. 재현 가능한 빌드와 설정 관리가 필요하다.
볼륨과 백업. 볼륨은 컨테이너와 데이터의 수명을 분리하는 데 쓰이지만 손실에 대비한 별도 사본과 복구 절차를 자동으로 보장하지 않는다. 영속성은 백업과 같은 말이 아니다.
Pod와 Service. Pod는 함께 실행되는 컨테이너의 배치 단위이고 Service는 변할 수 있는 대상에 접근할 안정적인 추상화를 제공한다. 특정 Pod 주소를 영구적인 서비스 주소로 취급하지 않는다.
readiness와 liveness. 준비 상태는 트래픽을 받을지 판단하고 생존 검사는 재시작이 필요한지 판단하는 데 사용한다. 외부 의존성의 짧은 장애가 모든 프로세스 재시작으로 번지지 않도록 설계한다.
설정과 비밀. 둘 다 실행에 필요하지만 노출 위험과 관리 방식이 다르다. 비밀은 접근과 수명, 회수와 교체를 별도로 관리한다. 일반 설정 파일과 같은 공개 경로에 두지 않는다.
로그와 지표. 로그는 개별 사건과 맥락을, 지표는 수치의 시간 변화를 요약한다. 요청별 상세 정보를 모든 지표 레이블에 넣으면 규모와 비용 문제가 생길 수 있다. 목적에 맞는 저장 방식을 고른다.
트레이스와 스팬. 트레이스는 요청 흐름을 연결하고 스팬은 그 안의 작업 구간을 나타낸다. 샘플링된 추적 자료가 모든 요청을 포함한다고 가정하지 않는다. 수집 정책을 알고 해석해야 한다.
SLI와 SLO. SLI는 관찰할 서비스 수준 지표이고 SLO는 그 지표의 목표다. 성공의 정의와 기간, 분모를 명시해야 숫자를 비교할 수 있다. 내부 자원 상태만으로 사용자 성공을 대표하지 않는다.
RTO와 RPO. RTO는 복구 시간 목표, RPO는 허용할 데이터 손실 시점과 관련된다. 빨리 켜지는 것과 최근 자료를 지키는 것은 별개의 요구다. 실제 복원 시험으로 둘을 확인한다.
롤백과 앞으로 수정. 롤백은 이전 상태로 돌아가는 복구이고 앞으로 수정은 현재 상태에서 문제를 해결하는 접근이다. 데이터 변경 때문에 이전 프로그램으로 돌아갈 수 없는 경우를 배포 전에 고려한다.
관찰과 가설. 관찰은 확인한 사실이고 가설은 그 사실을 설명하는 후보이다. 시간상 가까운 두 사건이 곧 원인과 결과는 아니다. 변경과 비교를 통해 가설을 검증하고 모르는 부분을 기록한다.
완료와 접수. 접수는 일을 받아들였다는 뜻이고 완료는 약속한 결과를 만들었다는 뜻이다. 비동기 시스템에서 두 상태를 명확히 보여 주어야 한다. 빠른 응답을 위해 완료되지 않은 일을 성공으로 표시하지 않는다.