노트

HTTP와 HTTPS

Hypertext Transfer Protocol Secure

인프라#http#security · 연결된 개념 6개

쉽게 말하면

HTTP가 누구나 읽을 수 있는 엽서라면, HTTPS는 같은 내용을 잠긴 봉투에 넣어 보내는 거예요. 중간에서 엿보거나 바꿀 수 없고, 인증서로 받는 쪽이 진짜 그 사이트인지도 확인해요.

비유가 깨지는 곳 봉투를 매번 무거운 자물쇠로 잠그진 않아요. 공개 키 암호는 처음 키를 합의하고 인증할 때만 쓰고 실제 데이터는 빠른 대칭 키로 암호화해요. TLS 1.3은 이 핸드셰이크를 한 번 왕복으로 줄였어요.

HTTPS는 HTTP(Hypertext Transfer Protocol) 메시지를 TLS(Transport Layer Security)로 감싸 보내는 방식이다. HTTP 자체는 바뀌지 않고, 그 아래에 암호화 계층이 하나 끼어든다. 기본 포트는 HTTP가 80, HTTPS가 443이다.

TLS가 주는 세 가지

  • 기밀성: 오가는 내용을 중간에서 엿봐도 읽을 수 없다(공용 와이파이 도청 방지)
  • 무결성: 중간에서 내용을 바꾸면 들킨다(광고 삽입·스크립트 변조 방지)
  • 인증: 인증서로 "이 서버가 정말 그 도메인의 주인"임을 확인한다. 인증서는 브라우저가 믿는 인증 기관(Certificate Authority, CA)이 서명한다 → 발급 실무는 Let's Encrypt로 HTTPS 적용

SSL(Secure Sockets Layer)은 TLS의 옛 이름이다. SSL 2.0·3.0은 모두 사용 금지됐지만(RFC 6176·7568) "SSL 인증서"라는 말은 아직 흔히 쓴다.

연결 과정(간단히)

TCP로 연결한 뒤 TLS 핸드셰이크를 한다. TLS 1.3에서는 키 공유 값을 주고받아 대칭 키를 합의하고, 그 키로 암호화된 상태에서 서버가 인증서를 보내면 브라우저가 검증한다. 이후 HTTP 요청·응답은 그 키로 암호화해 주고받는다.

sequenceDiagram
  participant B as 브라우저
  participant S as 서버
  B->>S: TCP 연결
  Note over B,S: TLS 핸드셰이크 (1.3 기준)
  B->>S: 키 공유 값
  S-->>B: 키 공유 값 + 암호화된 인증서
  Note over B: 대칭 키 합의, 인증서 검증
  B->>S: 암호화된 HTTP 요청
  S-->>B: 암호화된 HTTP 응답

공개 키 암호는 키 합의와 인증에만 쓰고, 실제 데이터는 빠른 대칭 키 암호로 보낸다. TLS 1.3은 처음 연결할 때의 전체 핸드셰이크 왕복을 1번(1-RTT)으로 줄였다(TLS 1.2는 2번). 외부 도메인의 이 비용을 미리 치르는 방법은 preconnect다.

프런트엔드에서 체감하는 차이

  • 서비스 워커(Service Worker), 위치 정보, 클립보드 같은 많은 브라우저 API는 보안 컨텍스트(Secure Context, HTTPS 또는 localhost)에서만 동작한다
  • Secure 쿠키는 HTTPS로만 전송된다 → HTTP 쿠키
  • HTTPS 페이지가 HTTP 리소스를 불러오면 혼합 콘텐츠(Mixed Content)로 막히거나, 이미지·미디어처럼 업그레이드 가능한 리소스는 HTTPS로 자동 전환된다
  • Strict-Transport-Security(HSTS) 헤더를 HTTPS 응답으로 받은 브라우저는 max-age 동안 그 도메인을 HTTPS로만 접속한다
  • 출처(origin)에는 스킴이 들어가므로 http://a.com과 https://a.com은 다른 출처다 → 동일 출처 정책

명세: RFC 9110 §4.2.2 — https URI Scheme · RFC 8446 §2 — TLS 1.3 Protocol Overview · RFC 6797 §8.1 — HTTP Strict Transport Security · RFC 6176 — SSL 2.0 금지 · RFC 7568 — SSL 3.0 폐기 · W3C — Secure Contexts · W3C — Mixed Content 출처: MDN — HTTPS · MDN — TLS · MDN — Strict-Transport-Security

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • XSS

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

  • Tailscale Serve와 Funnel

    Tailscale은 WireGuard 위에 만든 메시 VPN(mesh Virtual Private Network)으로, 내 기기들을 하나의 사설망(tailnet)으로 묶는다. tailscale serve는 내 기기의 로컬 서비스를 tailnet 안에서만 HTTPS로 열어 주고, tailscale funnel은 같은 서비스를 공개 인터넷에 연다.

  • CSRF

    CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조)는 로그인한 사용자가 악성 사이트를 방문했을 때, 그 사이트가 사용자의 브라우저를 시켜 사용자 모르게 원래 사이트에 요청을 보내게 하는 공격이다. 공격자는 토큰을 훔치지 않는다. 브라우저가 쿠키를 알아서 붙여 준다는 점을 이용한다.

  • 서버 전송 이벤트(SSE)

    서버 전송 이벤트(Server-Sent Events, SSE)는 HTTP(HyperText Transfer Protocol) 응답 하나를 닫지 않고 열어 둔 채, 서버가 원할 때마다 텍스트 이벤트를 흘려보내는 서버 → 클라이언트 단방향 푸시 방식이다. HTML 표준에 정의돼 있고 브라우저는 EventSource로 받는다.

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

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

보기 옵션