노트

hosts 파일

Hosts File

인프라#network#tooling · 연결된 개념 8개

쉽게 말하면

hosts 파일은 공용 주소록인 DNS를 찾아보기 전에 먼저 펼쳐 보는 내 수첩이에요. 여기에 '이 도메인은 내 컴퓨터'라고 적어 두면 로컬 서버를 운영 도메인처럼 띄워 쿠키와 CORS를 실제처럼 시험할 수 있어요.

비유가 깨지는 곳 수첩을 고쳐도 바로 반영되지 않을 수 있어요. OS와 브라우저가 DNS 캐시를 따로 들고 있어 비워야 하고, 다 쓴 항목을 남겨 두면 나중에 실제 사이트 대신 로컬로 가는 혼란이 생겨요.

도메인 이름과 IP 주소의 짝을 적어 두는 OS(Operating System)의 텍스트 파일. 이름을 해석할 때 DNS 서버보다 먼저 참조되므로, 특정 도메인을 내 컴퓨터나 다른 IP로 보내는 데 쓴다. macOS·Linux는 /etc/hosts, Windows는 C:\Windows\System32\drivers\etc\hosts다.

127.0.0.1   localhost
127.0.0.1   local.example.com

쓰는 경우: 로컬을 운영 도메인처럼

운영 API가 Domain=example.com 쿠키로 로그인을 유지하고 *.example.com만 CORS(Cross-Origin Resource Sharing)로 허용한다면, localhost:3000에서 띄운 프런트는 그 쿠키를 받지도 보내지도 못한다. hosts 파일에 local.example.com → 127.0.0.1을 적고 http://local.example.com:3000으로 접속하면:

  • 브라우저는 같은 도메인으로 보고 쿠키를 함께 보낸다
  • API 서버의 허용 출처 목록에도 들어간다 → 동일 출처 정책
  • 실제 환경과 같은 조건에서 인증·쿠키·CORS를 확인할 수 있다

다만 쿠키에 Secure가 붙어 있으면 HTTPS(HTTP Secure)가 필요하므로 로컬 인증서(TLS 인증서(Transport Layer Security) 대신 mkcert 같은 도구)를 함께 써야 한다.

바꾼 뒤

sudo vi /etc/hosts                 # 관리자 권한으로 편집
sudo dscacheutil -flushcache       # macOS DNS 캐시 비우기
sudo killall -HUP mDNSResponder

브라우저도 자체 DNS 캐시를 갖고 있어 바로 반영되지 않으면 브라우저를 다시 열어 본다. 다 쓴 항목은 지워 둔다. 남겨 두면 나중에 실제 사이트 대신 로컬로 가는 혼란이 생긴다.

참고: Wikipedia — hosts (file)

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • XSS

    XSS(Cross-Site Scripting)는 공격자가 넣은 스크립트가 내 사이트의 출처(origin) 권한으로 사용자 브라우저에서 실행되는 공격이다. 같은 출처의 코드로 돌기 때문에 same-origin-policy가 막아 주지 못한다. 그 스크립트는 페이지를 바꾸고, 로그인한 사용자 행세를 하며 요청을 보내고, JS가 읽을 수 있는 데이터(localStorage의 토큰 등)를 빼 갈 수 있다.

  • 브라우저 캐시

    한 번 받은 리소스(HTML·CSS·JS·이미지)를 브라우저가 저장해 두었다가 다시 쓰는 기능. 서버가 응답 헤더로 얼마나, 어떻게 캐시할지 알려 주고 브라우저가 그대로 따른다.

  • 브라우저 요청과 서버 간 요청

    같은 HTTP 요청이라도 브라우저에서 보내면 여러 보안 규칙이 강제되고, 서버에서 보내면 아무 제한이 없다. 브라우저 보안 정책은 신뢰할 수 없는 코드로부터 사용자를 지키려고 있기 때문이다.

  • Origin·Referer 헤더와 Referrer-Policy

    브라우저가 요청에 붙이는 두 헤더. Origin은 요청이 시작된 출처(프로토콜·호스트·포트)만, Referer는 요청을 일으킨 페이지의 URL(경로·쿼리까지)을 담는다. Referrer-Policy는 Referer에 얼마나 담을지 정한다.

  • 환경변수 스코프와 source

    셸에서 만든 변수는 기본적으로 그 셸 안에서만 보이고, export해야 그 셸이 띄우는 자식 프로세스(child process)에 전달된다. 그리고 스크립트를 실행하면 자식 프로세스에서 돌기 때문에, 스크립트가 바꾼 환경은 부모 셸로 돌아오지 않는다.

보기 옵션