[CS] HTTP

눈치없어·2025년 4월 30일

기본적으로 HTTP는 애플리케이션 계층(응용 계층)으로서 웹 서비스 통신에 사용됨


HTTP/1.0

  • 한 연결당 하나의 요청만 처리 가능
  • 요청마다 TCP 연결을 새로 생성해야 함

RTT 증가

  • 연결마다 TCP 3-way 핸드셰이크가 반복되므로
    RTT가 계속 누적, 성능 저하 발생

RTT
패킷이 목적지에 도달하고 나서 다시 출발지로 돌아오기까지 걸리는 시간이며 패킷 왕복 시간


RTT의 증가를 해결하기 위한 방법

📌 이미지 스플리팅

  • 여러 아이콘 이미지를 하나의 큰 이미지로 합침
  • 필요 부분은 CSS background-position으로 선택
#icons>li>a {
    background-image: url("icons.png");
    width: 25px;
    display: inline-block;
    height: 25px;
    repeat: no-repeat;
}
#icons>li:nth-child(1)>a {
    background-position: 2px -8px;
}
#icons>li:nth-child(2)>a {
    background-position: -29px -8px;
}

하나의 이미지인 icons.png를 기반으로 background-position을 통해 2개의 이미지를 설정한것을 볼 수 있음


📌 코드 압축

  • JS/CSS 코드에서 공백, 줄바꿈 제거
  • 파일 크기 최소화 → 전송 시간 단축
// before
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
    res.send('Hello World!')
})

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`)
})

// after
const express=require("express"),app=express(),port=3e3;app.get("/",(e,p)=>{p.send("Hello World!")}),app.listen(3e3,()=>{console.log("Example app listening on port 3000")});

📌 이미지 Base64 인코딩

  • 이미지를 텍스트 문자열로 인코딩
  • 별도 요청 없이 HTML 안에서 즉시 렌더링 가능
  • 단점: 파일 크기 약 37% 증가

인코딩
정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해 다른 형태나 형식으로 변환하는 처리 방식



HTTP/1.1

  • keep-alive 기본 지원
  • 한 번 TCP 연결(3-way 핸드셰이크) 후 다수의 요청/응답 처리 가능
  • 요청마다 TCP를 새로 맺을 필요 없음

Keep-Alive
한 연결을 계속 유지하며 여러 리소스를 연속 요청
ex) HTML → 이미지 → CSS → JS 요청까지 한 연결 안에서 처리


여전히 존재하는 단점

📌 HOL Blocking(Head Of Line Blocking)

  • 선두에 있는 요청이 지연되면 뒤 요청도 줄줄이 대기
  • 즉, 동시에 요청을 보내도 처리 순서는 직렬이라
    빠른 리소스도 늦게 도착할 수 있음
 image.jpg가 늦게 도착하면 styles.css, data.xml도 기다려야 함

📌 무거운 헤더 구조

  • 헤더가 크고 압축되지 않음
  • 쿠키, 메타데이터 등으로 트래픽 낭비 많음


HTTP/2

  • SPDY 프로토콜 기반에서 파생
  • 지연 시간 감소, 속도 향상, 효율성 강화

멀티플렉싱

  • 하나의 TCP 연결 안에서 여러 요청/응답을 병렬로 처리
  • 각 요청은 스트림 단위로 나뉨
  • 각 스트림은 프레임으로 조각내어 송수신
  • 손실된 스트림만 지연 → 나머지 스트림은 영향 없음
  • HTTP/1.1의 HOL Blocking 문제 해결

스트림(stream)
시간이 지남에 따라 사용할 수 있게 되는 일련의 데이터 요소를 가리키는 데이터 흐름


헤더 압축

  • HTTP/1.x의 무거운 헤더 문제를 해결하기 위해
  • HPACK이라는 압축 방식 도입
  • 내부적으로 허프만 코딩 알고리즘 사용

📌 허프만 코딩(Huffman Coding)

  • 빈도가 높은 데이터: 짧은 비트
  • 빈도가 낮은 데이터: 긴 비트
    → 전체적으로 데이터량 절감
  • 반복되는 헤더(예: 쿠키 등)를 효율적으로 압축

서버 푸시

  • 클라이언트 요청이 없어도 서버가 먼저 리소스를 전송 가능
  • 예: HTML 요청 시 → CSS, JS 파일을 자동으로 푸시


HTTPS

  • HTTP + SSL/TLS = HTTPS
  • 전송 계층과 애플리케이션 계층 사이에 SSL/TLS 계층을 추가하여
    데이터 암호화, 인증, 무결성을 보장

SSL/TLS

  • 보안 세션을 생성하여 암호화된 통신 제공
  • 보안 세션이 만들어질 때 인증 메커니즘, 키 교환 암호화 알고리즘, 해싱 알고리즘이 사용됨
  • 공격자가 서버인 척하며 사용자 정보를 가로채는 인터셉터 방지
  • 한 번의 1-RTT 핸드셰이크로 키 교환 및 인증 진행

📌 보안 세션 흐름

1️⃣ 클라이언트 → 서버
지원 가능한 암호 규약(Cipher Suite) 리스트 전달

2️⃣ 서버 → 클라이언트
인증서 + 암호 방식 선택 → 공개키 전달

3️⃣ 양쪽에서 공개키 + 개인키로 세션키 생성(PSK)

4️⃣ 세션 암호화 통신 시작

세션
운영체제가 어떠한 사용자로부터 자신의 자산 이용을 허락하는 일정한 기간
즉, 사용자는 일정 시간 동안 응용 프로그램, 자원 등을 사용 가능


📌 사이퍼 슈트

프로토콜, AEAD 사이퍼 모드, 해싱 알고리즘이 나열된 규약

  • TLS_AES_128_GCM_SHA256
  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_CCM_SHA256
  • TLS_AES_128_CCM_8_SHA256

예시

  • TLS_AES_128_GCM_SHA256
    - TLS: 프로토콜
    - AES_128_GCM: 암호화 방식
    - SHA256: 해싱 알고리즘

📌 AEAD 사이퍼 모드

  • Authenticated Encryption with Associated Data
  • 암호화와 인증을 동시에 수행하는 방식
  • ex) AES_128_GCM, CHACHA20_POLY1305 등

📌 인증 메커니즘 (CA 인증서)

  • CA(인증기관)가 발급한 인증서를 통해 서버의 신뢰성과 공개키를 클라이언트에 제공
  • 예시 기업: GlobalSign, Comodo, Amazon
  • 인증서 = 서비스 정보 + 공개키 + 지문(fingerprint) + 디지털 서명

개인키: 비밀키라고도 하며, 개인이 소유하고 있는 키이자 반드시 자신만이 소유해야 하는 키
공개키: 공개되어 있는 키


📌 해싱 알고리즘

  • 대표적으로 SHA-256 사용
  • 데이터를 일정한 길이의 무작위 같은 문자열로 변환
  • 비밀번호 저장, 무결성 확인 등에 필수

SHA-256 알고리즘
해시 함수의 결괏값이 256비트인 알고리즘

해시: 다양한 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑한 값
해싱: 임의의 데이터를 해시로 바꿔주는 일이며 해시 함수가 이를 담당
해시 함수: 임의의 데이터를 입력으로 받아 일정한 길이의 데이터로 바꿔주는 함수


SEO에도 도움이 되는 HTTPS

  • 검색 결과 상위 노출을 위한 기술적 최적화
  • 구글은 HTTPS 사용 여부를 랭킹 요소로 명시함

항목설명
캐노니컬 설정중복 콘텐츠를 하나로 간주
메타 설정제목/설명 키워드 최적화
페이지 속도로딩 속도 향상, 점수 측정 툴: PageSpeed Insights
사이트맵검색엔진이 페이지 구조 인식 (예: sitemap.xml)

HTTPS 구축 방법

1️⃣ CA로부터 인증서 구매 후 직접 서버에 적용

2️⃣ 로드밸런서에서 HTTPS 처리

3️⃣ CDN(Cloudflare 등)을 통해 HTTPS 제공



HTTP/3

  • HTTP/1.1 → TCP 기반
  • HTTP/2 → TCP + TLS 기반 (멀티플렉싱 도입)
  • HTTP/3 → UDP + QUIC 기반
    → 빠른 연결, 지연 시간 감소, 안정성 확보
  • 새로운 계층 QUIC 위에서 동작

QUIC

Google이 개발한 UDP 기반 전송 계층 프로토콜

  • UDP 기반 → 3-way 핸드셰이크 불필요
  • TLS 1.3 내장 → 암호화 기본 적용
  • 멀티플렉싱 기본 지원
  • FEC (Forward Error Correction)
    → 패킷 손실을 스스로 복구함 → 영상/모바일에 유리

초기 연결 설정 시 지연 시간 감소

  • 초기 연결에서 TCP처럼 3-웨이 핸드셰이크 안 함

  • 최초 접속: 1-RTT, 재접속 시: 0-RTT
    → 브라우저에서 즉시 통신 시작 가능

     체감 속도 향상, 특히 모바일 환경에서 유리



참고: 북스터디 - 면접을 위한 CS 전공지식 노트 (Chapter 2-5)

profile
dock 사이즈 다르잖아

0개의 댓글