2025-11-17
오늘 배운 것
네트워크
- OSI 7계층 / TCP-IP 4계층
-
OSI 7계층
계층 역할 대표 프로토콜 PDU 7. Application 웹/메일/파일 전송 등 애플리케이션 기능 HTTP, FTP, DNS, SMTP Data 6. Presentation 인코딩, 암호화, 압축 JPEG, MPEG, TLS(일부 기능) Data 5. Session 세션 연결/유지/종료 NetBIOS, RPC Data 4. Transport 종단 간 신뢰성, 포트번호 TCP, UDP Segment(TCP) / Datagram(UDP) 3. Network IP 주소, 라우팅 IP, ICMP, ARP Packet 2. Data Link 프레임화, MAC 주소 Ethernet, PPP Frame 1. Physical 전기 신호, 비트 전달 케이블, 전파 Bit -
TCP/IP 4계층
TCP/IP 계층 OSI 대응 역할 대표 프로토콜 PDU Application OSI 5~7 애플리케이션 통신 HTTP, DNS, FTP Data Transport OSI 4 신뢰성/순서/포트 TCP, UDP Segment / Datagram Internet OSI 3 라우팅, IP 주소 IP, ICMP Packet Network Access OSI 1~2 프레임 전송, 물리 매체 Ethernet, Wi-Fi Frame / Bit -
OSI vs TCP/IP
구분 OSI 7계층 TCP/IP 4계층 목적 이론적 모델 실제 인터넷 표준 계층 수 7개 4개 5~7계층 Application/Presentation/Session Application 계층 하나로 통합 1~2계층 Physical + Data Link Network Access로 통합
-
- IP, Subnet, ARP, Routing
- IP(Internet Protocol)
- 네트워크에서 호스트를 식별하는 논리적 주소
- 패킷을 목적지까지 전달하기 위한 주소 체계
- 역할
- 호스트 식별
- 네트워크 경로 지정
- 데이터그램 기반(비연결형, 비신뢰성)
- 구성
- 네트워크 부분 + 호스트 부분
- 서브넷 마스크에 따라 구분됨
- IPv4 헤더 핵심 필드
- Source IP / Destination IP
- TTL(Time To Live)
- Protocol(TCP=6, UDP=17)
- Header Checksum
- Subnet
- 큰 네트워크를 작은 네트워크(서브넷)으로 나누는 기술
- 목적
- IP 효율적 사용
- 브로드캐스트 범위 감소
- 보안/네트워크 분리
- 표기 방식
- 192.168.0.0/24
- /24 → 앞 24비트가 네트워크
- 가능한 호스트 수 : 256개
- 서브넷 마스크
- 255.255.255. 0 = /24
- 네트워크와 호스트 비트를 구분하는 값
- ARP (Address Resolution Protocol)
- IP → MAC 주소를 매핑하는 프로토콜
- 동일 LAN 내에서 목적지 MAC 주소를 알아낼 때 사용
- 동작 과정
- ARP Request(브로드캐스트)
- ARP Reply(유니캐스트)
- 결과를 ARP Cache에 저장
- ARP Cache
- 일정 시간 저장
- MAC 스푸핑 공격 위험 → 보안 포인트 가능
- 라우팅
- 패킷을 다른 네트워크로 전달하기 위한 경로 결정 과정
- 목적
- 목적지 IP를 보고 어떤 경로로 보낼지 판단
- 라우터가 동작
- 라우팅 방법
- 정적 라우팅(수동 설정)
- 변화 적고 구조 단순한 환경에 유리
- 동적 라우팅(프로토콜 기반 자동 선택)
- RIP : 거리 기반
- OSPF : 링크 상태 기반
- BGP : 자율 네트워크 간 라우팅 (대형 서비스 필수)
- 정적 라우팅(수동 설정)
- 라우팅테이블
- 0.0.0.0/0 기본 게이트웨이
- IP(Internet Protocol)
-
TCP / UDP 비교
| 구분 | TCP | UDP | | — | — | — | | 연결 방식 | 연결형 (3-way handshake) | 비연결형 | | 신뢰성 | 보장(O) | 보장(X) | | 순서 보장 | O | X | | 재전송 | O | X | | 흐름/혼잡 제어 | O | X | | 속도 | 느림 | 빠름 | | 대표 사용 | HTTP/HTTPS, DB, 파일전송 | 게임, 스트리밍, DNS |
- HTPTP/3 는 UDP 기반
- QUIC를 사용 → 핸드쉐이크 감소 + 속도 개선
- HTPTP/3 는 UDP 기반
- 3-Way / 4-Way Handshake
- 3-Way Handshake(TCP 연결 수립)
- TCP가 연결을 시작할 때 사용하는 절차
- 과정
- SYN
- 클라이언트 → 서버
- 연결하고 싶어(SYN), 내 시퀀스 번호는 X야
- SYN + ACK
- 서버 → 클라이언트
- 좋아 네걸 받았어(ACK), 나도 연결할래(SYN), 내 시퀀스 번호는 Y야
- ACK
- 클라이언트 → 서버
- 서버의 SYN도 확인했어(ACK)
- 이후 연결 수립 완료
- SYN
- 4-way Handshake (TCP 연결 종료)
- 과정
- FIN
- client → server
- 나 이제 보낼 데이터 없어
- ACK
- server → client
- 알겠어 너는 끊어도 돼
- FIN
- server → client
- 나도 이제 보낼 데이터 없어
- ACK
- client → server
- 알겠어
- 이후 종료
- FIN
- 과정
- 연결은 3번, 종료는 4번인 이유
- 연결은 양쪽이 동시에 준비만 확인하면 됌
- 서버는 SYN을 받는 동시에 ACK와 SYN를 합쳐 보낼 수 있음
- 종료는 각 방향 독립적으로 종료해야 하기 때문
- 연결은 양쪽이 동시에 준비만 확인하면 됌
- 3-Way Handshake(TCP 연결 수립)
- 흐름제어 / 혼잡제어 / 오류제어
- 흐름 제어
- 송신자가 너무 빨리 보내서 수신자 버퍼가 넘치는 것 방지
- 대표 기법 : Stop-and-Wait, Sliding Window
- sliding window 방식이 실무의 핵심
- 수신자가 내가 처리 가능한 윈도우 크기(Receive Window, RWND)를 알려줌
- 송신자는 그 범위 내에서만 데이터를 전송 → 수신자 버퍼 오버플로우 방지
- 혼잡 제어
- 네트워크 자체가 혼잡해져서 패킷 유실이 발생하는 것 방지
- 대표 알고리즘
- slow start
- 처음에는 cwnd=1로 매우 느리게 시작
- ACK 오면 창 크기 2배씩 증가 → 빠른 성능 회복
- Congestion Avoidence
- 특정 시점 이후(임계점)부터는 선형 증가로 변경 → 네트워크를 과부하시키지 않기 위해
- Fast Retransmit
- 같은 ACK를 3번 받으면 → 중간에 하나 유실 됐구나 하고 바로 재전송
- Fast Recovery
- 패킷 하나 유실된 거면 cwnd를 절반으로 줄이고
- 다시 혼잡 회피 단계로 이동 → 연결을 완전히 떨어뜨리지 않음
- slow start
- 오류제어
- 전송 과정에서 패킷이 깨지거나 유실될 때 처리하는 기법
- 방법
- Checksum
- 패킷 손상 여부 확인
- 재전송(ARQ)
- 누락 되면 재전송
- Sequencing
- 패킷 순서 보장
- ACK + Timeout(RTO)
- 일정 시간 ACK 안오면 재전송
- Checksum
- 흐름 제어
- TCP 성능 요소(RTT, RTO, 윈도우, TIME_WAIT)
- RTT (Round Trip Time)
- 패킷이 왕복하는 데 걸리는 시간
- 개념
- 클라이언트 → 서버로 패킷 전송
- 서버 → ACK 응답
- 와복시간 = RTT
- 중요 이유
- RTT가 높으면 TCP 속도 저하
- 혼잡 제어/재전송 타이머(RTO) 계산에도 사용됨
- RTO(Retransmission Timeout)
- ACK가 오지 않을 때 재전송하기까지 기다리는 시간
- 동작
- 송신자가 패킷 전송
- ACK 일정시간(RTO) 안오면 → 패킷 유실로 판단하고 재전송
- 계산 방식
- 과거 RTT 를 기반으로 동적 계산
- RTT 변동이 클수록 RTO도 길어짐
- 너무 짧으면 불필요한 중복 전송 발생
- 너무 길면 복구가 너무 느려짐
- 윈도우
- 한 번에 전송할 수 있는 데이터 양
- 송신 윈도우(cwnd)
- 혼잡제어와 관련됨
- 네트워크 혼잡 수준 고려
- 수신 윈도우(rwnd)
- 수신자의 처리 가능한 버퍼 크기
- 흐름제어와 관련됨
- TIME_WAIT
- TCP 연결 종료 후 일정시간 (일반적으로 2MSL) 동안 대기하는 상태
- 필요 이유
- 늦게 도착한 패킷(지연 패킷) 제거
- 종료된 이전 연결의 패킷이 다음 연결로 잘못 전달되는 것 방지
- 서버의 FIN 재전송 처리
- 서버가 ACK 못받았네 하고 FIN을 다시 보낼 수 있으므로
- 클라이언트가 살아서 그 FIN을 받아주는 상태여야 함
- 어디가 TIME_WAIT?
- 보통 연결 종료를 먼저 요청한 쪽
- 늦게 도착한 패킷(지연 패킷) 제거
- RTT (Round Trip Time)
-
HTTP 1.1 / 2 / 3 비교
| 항목 | HTTP/1.1 | HTTP/2 | HTTP/3 | | — | — | — | — | | 기반 | TCP | TCP | UDP(QUIC) | | 요청 처리 | 순차적 | Multiplexing | Multiplexing | | HOL Blocking | 심함 | TCP 레벨에서 존재 | 거의 없음 | | 헤더 | 텍스트 | HPACK(압축) | QPACK(압축) | | 연결 설정 | 느림 | 개선 | 0-RTT | | 모바일 변경 | 끊김 | 끊김 | Connection ID로 유지 |
- HTTP/1.1 - 성능 제약 많은 기본 버전
- 특징
- Persistent Connection(Keep-Alive) 도입 → 요청마다 연결 새로 열지 않음
- 하지만 요청은 순차적 처리(Head-of-Line Blocking) → 첫 요청이 늦어지면 뒤 요청도 같이 막힘
- 다수의 리소스를 받으려면 → 여러 TCP 연결을 병렬로 열어야 함(비효율)
- 문제점
- HOL Blocking
- TCP 연결 과도 생성
- 헤더 중복 전송(매 요청마다 모든 헤더 전송)
- 특징
- HTTP/2 - 성능 대폭 개선된 버전
- 핵심 기술
- 멀티플렉싱
- 하나의 TCP 연결에서 여러 요청/응답을 동시에 병렬 처리
- HOL Blocking(애플리케이션 레벨) 제거
- HPACK 헤더 압축
- 중복 헤더를 압축 → 네트워크 전송량 감소
- Server Push(지금은 대부분 비활성)
- 너 이파일도 필요하지? 하고 서버가 먼저 리소스 푸시 → 지금은 남용 문제로 많이 꺼짐
- Binary Framing Layer
- HTTP/1.1의 텍스트 프롴토콜 → 바이너리 프로토콜
- 파싱 비용 감소
- 멀티플렉싱
- 여전히 남은 문제
- 전송 계층 HOL Blocking은 남아 있음
- TCP 위에서 동작하기 때문에
- 패킷 하나 손실되면 전체 스트림이 멈춤
- 전송 계층 HOL Blocking은 남아 있음
- 핵심 기술
- HTTP/3 - QUIC(UDP 기반)으로 TCP 한계를 완전히 제거
- 핵심 기술
- UDP 기반 QUIC 프로토콜 사용
- TCP가 갖는 HOL Blocking 제거
- 패킷 손실 시 해당 스트림만 재전송 → 다른 스트림은 영향 없음
- 0-RTT 핸드셰이크
- 연결 설정 거의 없음
- HTTPS 기반이라 TLS를 프로토콜에 내장 → 연결 지연 크게 감소
- 연결 ID
- 네트워크 변경(와이파이 ↔ LTE) 에도 연결 유지 → 모바일 환경에 최적
- UDP 기반 QUIC 프로토콜 사용
- 핵심 기술
- HTTP/1.1 - 성능 제약 많은 기본 버전
- HTTPS & TLS 구조
- HTTPS
- HTTP + TLS로 암호화된 안전한 통신
- 기존 HTPTP는 평문 → 중간에서 그대로 볼 수 있음
- HTTPS는 TLS를 사용해 암호화 + 무결성 + 인증 제공
- HTTPS가 제공하는 3가지 보안 성질
- 기밀성
- 제 3자가 내용을 볼 수 없음
- 대칭키 암호화로 빠르게 암호화
- 무결성
- 데이터가 중간에 변조되지 않음
- MAC/Hash로 검증
- 인증
- 서버가 진짜인지 확인
- 인증서(CA) 기반
- 기밀성
- TLS Handshake의 핵심 흐름
- HTTPS가 안전한 이유는 TLS Handshake로 대칭키를 안전하게 공유하고, 서버의 신원을 확인
- TLS 1.2
- ClientHello
- 클라이언트가 지원 가능한 암호방식 목록 전송
- 랜덤값 전송
- ServerHello + Server Certificate
- 서버가 사용할 암호 방식 선택
- 서버 인증서(CA가 서명한 공개키) 전송 → 클라이언트는 인증서 검증(위조 여부 확인)
- Client Key Exchange
- 클라이언트가 대칭키를 서버 공개키로 암호화하여 전송 → 도청자도 공개키로는 복호화 불가능!
- Finished
- 서로 동일한 대칭키를 공유했음을 확인하고 암호화 통신 시작
- ClientHello
- TLS 1.3
- Handshake 단계를 1 ~ 2 RTT → 1 RTT로 축소
- 불필요한 프로토콜 제거
- 속도 증가, 보안성 강화
- 현대 웹 대부분 TLS 1.3 사용
- 대칭키 + 비대칭키 같이 사용하는 이유
- 비대칭키(공개키/개인키)
- 매운 안전
- 하지만 암호화 속도가 느림
- 대칭키
- 빠름
- 하지만 키 교환이 위험
- 따라서
- 키 교환은 비대칭키로
- 실제 데이터 암호화는 대칭키로 하는 조합이 가장 효율적
- 비대칭키(공개키/개인키)
- 인증서가 하는 역할
- 인증서
- 서버의 공개키 + 서버 정보 + CA 서명
- 필요 이유
- 클라이언트가 이 서버가 진짜냐? 를 확인하기 위해
- 인증서 인증 과정
- 서버가 인증서 전달
- 클라이언트는 CA의 공개키로 서명 검증
- 위조되면 TLS handshake 실패
- 브라우저 경고 발새
- 인증서
- HTTPS
- DNS 동작 방식
- DNS
- 도메인 주소를 IP 주소로 바꿔주는 시스템
- 조회 절차
- 브라우저 캐시 확인
- 이미 기록되어 있으면 바로 사용
- OS 캐시(Local DNS cache) 확인
- 운영체제 내부 DNS 캐시
- 로컬 DNS 서버(Resolver)로 요청
- 보통 ISP(SK/KT/LG)나 회사 내부 DNS
- 재귀/반복 질의를 통한 IP 조회
- Resolver가 대신 여러 DNS 서버를 순서대로 조회
- 조회 순서
- Root DNS 서버
- . com 담당 서버로가
- TLD DNS 서버(.com)
- kakao.com 담당 서버로가
- Authoritative DNS 서버
- 실제 IP 주소 반환
- Root DNS 서버
- 결과 캐싱
- Resolver 캐싱
- OS 캐싱
- 브라우저 캐싱
- TTL이 만료되기 전까지 재조회 안함
- 브라우저 캐시 확인
-
DNS 레코드 종류
| 레코드 | 내용 | | — | — | | A Record | 도메인 → IPv4 주소 | | AAAA Record | 도메인 → IPv6 주소 | | CNAME | 도메인 → 또 다른 도메인 | | MX | 메일 서버 주소 | | NS | DNS 서버 주소 | | TXT | SPF, DKIM 등 인증 정보 |
- 서비스 확장 시 CNAME 기반으로 CDN 연결 자주 사용
- DNS의 캐싱 구조
- DNS는 속도 때문에 다음 계층에서 모두 캐싱
- 브라우저 캐시
- OS DNS 캐시
- 로컬 Resolver(ISP)
- Authoritative DNS
- TTL이 높을수록 → 빠르지만, 변경 반영이 느림
- TTL이 낮을 수록 → 변경이 빠르지만, 매번 DNS 조회 비용 증가
- DNS는 속도 때문에 다음 계층에서 모두 캐싱
- DNS Lookup 최적화
- CDN(클라우드플레어 같은거)과 함께 사용해 지리적으로 가까운 노드 연결
- DNS Prefetch 등 브라우저 최적화 가
- DNS
- DNS 기반 로드밸런싱
- DNS 기반 로드 밸런싱
- DNS가 여러 IP 중 하나를 돌려주면서 트래픽을 분산하는 방식
- 도메인 1개에 여러 서버 IP를 등록해두고 → DNS가 IP를 번갈아 응답
- 동작 방식
-
여러 A 레코드 등록
kakao.com → 10.0.0.1 kakao.com → 10.0.0.2 kakao.com → 10.0.0.3 - Resolver가 IP하나 선택
- 보통 라운드 로빈 (1→2→3→1)
- 선택된 서버로 트래픽 연결
- 클라이언트는 DNS가 준 IP로 직접 요청을 보냄
-
- 장점
- 인프라 구성 간단
- 서버 여러 대 등록만 하면 됨
- 전세계 사용자 분산
- Geo DNS를 사용하면 근접한 지역 서버로 연결 가능
- 전세계 CDN 네트워크도 DNS 기반
- Cloudflare, Akamai 등이 사용
- 인프라 구성 간단
- 단점
- DNS 캐싱 때문에 즉각적인 변경이 어려움
- TTL이 남아있으면 죽은 서버 IP를 그대로 사용해버릴 수 있음
- 트래픽 분산이 균등하지 않을 수 있음
- Resolver/브라우저 캐싱 때문에 예상보다 특정 IP로 트래픽이 몰리기도 함
- 서버 Health Check 불가
- DNS 자체가 “서버 상태”를 모름
- 죽은 서버 IP도 그냥 내려줄 수 있음
- 따라서 대부분 L4/L7 LB와 함께 사용
- DNS는 큰 방향만 분산
- 실제 정교한 분산은 로드밸런서가 처리
- DNS 캐싱 때문에 즉각적인 변경이 어려움
- Geo DNS
- DNS가 사용자의 대략적인 위치에 따라 다른 IP를 줌
- 한국 → 서울 리전 IP
- 일본 → 도쿄 리전 IP
- 전세계 트래픽 분산 + 지연 최소화
- DNS가 사용자의 대략적인 위치에 따라 다른 IP를 줌
- DNS 기반 로드 밸런싱
-
L4 / L7 Load Balancer
| 구분 | L4 LB | L7 LB | | — | — | — | | 계층 | 전송 계층 | 애플리케이션 계층 | | 판단 기준 | IP, Port | URL, Header, Cookie | | 성능 | 매우 빠름 | 상대적으로 느림 | | 기능 | 단순 분산 | 세션·도메인·경로 기반 라우팅 | | 사용처 | 게임, 메시지 서버 | 웹 서비스, API 서버 |
- 로드 밸런싱의 목적
- 여러 서버에 트래픽 고르게 분산하여
- 과부하 방지
- 장애 시 자동 우회
- 서비스 성능 및 안정성 향상
- 여러 서버에 트래픽 고르게 분산하여
- L4 로드 밸런서(전송 계층 로드밸런서)
- 특징
- TCP/UDP 포트 기반 분산
- 패킷의 IP+Port 정보만 보고 판단
- 내용(HTTP 요청 내용)은 모름
- 장점
- 빠름(단순 처림)
- 비용 낮음
- 고성능 대량 트래픽 처리에 강함
- 단점
- URI/헤더/쿠키 기반 분배 불가
- 특정 사용자 세션 고정 등의 고급 기능 어려움
- 언제 사용?
- HTTP 외의 프로토콜
- 메시지 서버(TCP), 게임 서버 등
- 단순 트래픽 분산 목적
- 특징
- L7 로드 밸런서 (애플리케이션 계층 로드밸런서)
- 특징
- HTTP 헤더, 쿠키, URI, 메서드 등 패킷 내용을 분석해서 분산
- 요청 내용을 보고 어디로 보낼지 판단 가능
- 장점
- Path 기반 라우팅 (/api/v1, /image 등)
- Host 기반 라우팅 (mobile.kakao.com)
- Cookie 기반 세션 유지(Sticky Session)
- 캐싱 / 압축 / SSL 종료(TLS Offloading) 가능
- 단점
- 패킷 분석 비용 높음 → 속도 L4보다 느림
- 비용 높음
- 언제 사용
- 웹서비스 대부분 (REST API, 웹앱 등)
- 기능/도메인별 라우팅 필요할 때
- 인증/보안 처리할 때
- 특징
- 로드밸런서에서의 Health Check
- L4
- TCP Port 열림확인
- Ping/Port 체크 정도
- L7
- 특정 URL GET 요청
- 응답 코드(200 여부) 확인
- JSON 응답까지 검증가능
- L4 보다 더 정확하게 장애 감지
- L4
- Sticky Session
- 같은 사용자의 요청을 항상 같은 서버로 보내는 기능
- 예 : 로그인 세션 서버별 분리 시 필요
- 구현방식
- L7 : Cookie 기반
- L4 : Source IP 기반 (부정확)
- 단점
- 특정 서버 과부하 위험
- 서버 장애 시 세션 유실가능
- 그래서 보통 Redis 같은 세션 공유 사용
- 로드 밸런싱의 목적
-
Proxy / Reverse Proxy
| 구분 | Forward Proxy | Reverse Proxy | | — | — | — | | 위치 | 클라이언트 앞 | 서버 앞 | | 목적 | 클라이언트 보호, 익명성 | 서버 보호, 로드밸런싱 | | 클라이언트는? | 프록시 존재 알고 있음 | 서버의 존재를 모름 | | 대표 예 | 회사 프록시, VPN | Nginx, ALB | | 사용 방향 | 안 → 밖 | 밖 → 안 |
- forward proxy (프록시)
- 정의
- 클라이언트 앞단에 위치하여 클라이언트 → 프록시 → 인터넷 구조로 동작하는 서버
- 클라이언트가 직접 외부 서버에 접근하지 않고 프록시가 대신 요청을 보내고 응답을 전달
- 역할
- 클라이언트 IP 숨기기(익명성)
- 캐싱을 통한 응답 속도 향상
- 접근 제한 우회
- 보안 정책 적용
- 사용 예
- 회사, 학교에서 외부 인터넷 접속할 때
- VPN, 웹 필터링 시스템
- 정의
- reverse proxy (리버스 프록시)
- 정의
- 서버(백엔드) 앞단에 위치하여 클라이언트는 항상 리버스 프록시만 본다
- 실제 서버는 내부에 숨겨져 있다
- 클라이언트 → 리버스 프록시 → 여러 백엔드 서버
- 역할
- 로드 밸런싱(L7 로드밸런서 역할 가능)
- SSL/TLS 종료
- 캐싱
- 보안(원 서버 IP 숨김)
- 압축, 헤더 조작
- 사용 예
- Nginx
- Envoy
- Apache
- AWS ALB(사실상 L7 LB= 리버스 프록시 역할)
- 정의
- forward proxy (프록시)
- REST API 네트워크 관점
- REST 개념
- REST는 리소스를 URI로 표현하고
- HTTP 메서드로 해당 리소스에 대한 행위를 정의하는 아키텍처 스타일
- 네트워크 관점에서 Stateless /Cacheable / Uniform Interface가 중요
- HTTP 메서드의 네트워크적 의미
- GET
- 데이터 조회
- 멱등(Idempotent)
- 캐싱 가능
- Body 없음
- POST
- 리소스 생성
- 멱등 아님
- 캐싱 X
- 항상 새 요청으로 처리
- PUT
- 리소스 전체 교체
- 멱등(같은 요청 여러 번 보내도 결과 동일)
- PATCH
- 리소스 부분 수정
- 멱등 보장 X (서버 구현에 따라 다름
- DELETE
- 리소스 삭제
- 멱등(여러번 삭제 요청해도 상태 동일)
- GET
-
멱등성 : 같은 요청을 여러번 보내도 결과가 달라지지 않는 성질
Method Idempotent? 이유 GET O 조회이므로 PUT O 같은 내용으로 다시 보내면 동일함 DELETE O 여러 번 삭제해도 결과는 “없음” POST X 여러 번 보내면 중복 생성 - Stateless
- 서버는 요청 간 클라이언트 상태를 보관하지 않음
- 특징
- 실무에서의 중요성
- 서버는 요청 간 클라이언트 상태를 보관하지 않음
- Cache
- HTTP 레이어 캐시 활용
- Cache-Control
- public, private, max-age 적용
- 정적 리소스 요청 성능 극대화
- ETag / If-None-Match
- 서버가 파일 버전 제공
- 브라우저가 ETag와 비교 → 바뀌지 않았으면 304 Not Modified
- GET만 캐싱하도록 원칙화
- 어떤 메서드가 캐싱가능한지는 네트워크 레벨에서 매우 중요
- URI 설계 - 네트워크 자원 기준
- 좋은 REST API는 URI가 네트워크 자원 중심
- 특징
- 리소스 중심
- 동사 대신 명사 사용
- 계층 구조 표현
- 보안 요소
- HTTPS 필수
- 기밀성/무결성 확보
- 중간자 공격 방지
- CORS
- Origin 기반 통제
- 인증방식
- JWT, OAuth2
- 모든 요청에 인증 정보 포함 → Stateless 유지
- HTTPS 필수
- REST 개념
-
WebSocket / SSE / Long Polling
| 기술 | 방식 | 방향 | 장점 | 단점 | 사용 예 | | — | — | — | — | — | — | | Long Polling | 요청 후 응답 지연 | 단방향(사실상 요청 기반) | 구현 쉬움 | 요청 과다, 비효율 | 푸시 미지원 환경 | | SSE | HTTP Persistent 연결 | 서버 → 클라이언트 | 서버 Push, 자동 재연결 | 단방향 | 알림, 이벤트 스트림 | | WebSocket | 프로토콜 업그레이드 | 양방향 | 실시간, 효율적 | 인프라 설정 필요 | 채팅, 게임, 실시간 주식 |
- Long Polling (긴 폴링)
- 동작 방식
- 클라이언트가 서버에 요청 전송
- 서버는 새 데이터가 생길 때까지 응답을 지연
- 데이터 생기면 응답하고, 클라이언트는 즉시 다시요청을 보냄(무한 반복)
- 장점
- WebSocket 지원 안되는 환경에서도 사용 가능
- 즉시 응답 효과
- 단점
- 요청/응답 반복 → 비효율
- 연결이 지속적으로 끊겼다 다시 생김
- 서버 부하 증가
- 모바일 환경에서 네트워크 소모 증가
- 동작 방식
- SSE(Server-Sent Events)
- 서버 → 클라이언트 단반향 스트리밍
- 동작 방식
- 클라이언트가 HTTP 요청(Open)
- 서버는 연결을 유지한 채로 여러 개 이벤트를 계속 푸시
- 클라이언트는 브라우저 EventSource로 수신
- 장점
- HTTP 기반이라 구현 쉬움
- 서버에서 클라이언트로 이벤트 푸시 가능
- 자동 재연결 기능
- 헤더 기반 인증 가능
- 단점
- 단반향(서버 → 클라이언트만 가능)
- 바이너리 전송 불가
- 웹소켓 보다 유연성 떨어짐
- WebSocket(양방향 실시간 통신)
- 서버 ↔ 클라이언트가 모두 실시간으로 주고받는 Full Duplex 방식
- 동작 방식
- 처음에는 HTTP로 Handshake
- 이후 WebSocket 프로토콜로 업그레이드
- 단일 연결로 양방향 지속 통신 가능
- 장점
- 진짜 실시간 통신
- 양방향(채팅/게임/트레이딩)
- 헤더 오버헤드 매우 적음
- 서버 부하 적음( 긴 풀링 대비)
- 단점
- 서버 / 로드밸러서 / 방화벽 설정 필요(L7에서 업그레이드 처리)
- 연결 유지 비용 존재
- 메시징 서버 구현 난이도 증가
- Long Polling (긴 폴링)
- 브라우저 캐시 & CDN
- 브라우저 캐시
- 클라이언트(브라우저) 측에서 리소스를 저장해 서버 요청 없이 빠르게 로딩하는 기술
- Cache-Control (강력 캐시 / Hard Cache)
- 서버가 캐싱 규칙을 헤더로 지정
- 주요 옵션
- 동작
- ETag(조건부 요청 / Validation Cache)
- 파일 버전을 식별하는 해시값 같은것
- Last-Modified / If-Modified-Since
- ETag 와 유사하지만 시간 비교 기반이라 정밀도 떨어짐
- CDN (Content Delivery Network
- 전세계에 분산된 캐시 서버(엣지 서버)를 통해 사용자와 지리적으로 가까운 곳에서 콘텐츠 제공
- 예 : Cloudflare, Akamai, AWS CloudFront
- 동작 방식
- 사용자가 static.kakao.com/logo.png 요청
- 가장 가까운 CDN 엣지 서버로 요청 라우팅
- 엣지 서버에 캐시가 있으면 즉시 응답
- 없으면 원본 서버에서 가져와 캐싱
- 이후부터는 캐시된 파일로 빠르게 응답
- 장점
- 성능 향상
- 서버 부하 감소
- 글로벌 서비스 필수
- 캐시 정책
- HTTP 캐시 규칙(Cache-Control, ETag)을 그대로 따름
- 오리진 서버의 헤더를 그대로 복사해 캐싱 전략 결정
- 브라우저 캐시 + CDN 조합이 중요한 이유
- 대형 서비스는 정적 리소스의 대부분을 CDN에 캐싱해두고 사용자는 브라우저 캐시까지 활용
- 이구조로 트래픽의 70~90% 오프로딩 가능
- 브라우저 캐시
- 네트워크 장애 분석 절차
- 문제 범위 파악
- 체크 항목
- 특정 사용자만의 문제인지?
- 특정 지역/ISP만 문제인지?
- 전체 서비스인지
- 특정 기능(API)만 문제인지
- 장애 범위 좁히기가 빠른 복구의 핵심
- 체크 항목
- 네트워크 계층 별 분리(OSI 관점 트러블 슈팅)
- 물리계층(1)
- 케이블/서버/네트워크 장비 장애
- NIC(네트워크 인터페이스 컨트롤러 고유한 맥주소가지고있음) 다운 → ping도 안됨
- 데이터 링크 계층(2)
- MAC 충돌, ARP 문제
- 스위치 포트 다운
- 네트워크 (3)
- 라우팅 문제
- 잘못된 게이트 웨이
- 서브넷 설정 오류
- VPN/Firewall 설정 → traceroute로 확인 가능
- 전송 계층 (4)
- TCP handshake 실패
- 포트 차단 → telnet/nc로 포트 열림 확인
- 애플리케이션 (7)
- API 오류
- DB 장애
- SSL 인증서 만료
- LB 라우팅 문제 → HTTP 상태 코드/로그 확인
- 계층별로 접근하면 문제원인 빠르게 좁히기 가능
- 물리계층(1)
- 핵심 진단 도구 활용
- Ping
- ICMP 응답 여부 → 네트워크 기초 연결 확인
- Traceroute
- 어느 구간에서 끊기는지 확인(라우팅 문제 확인)
- nslookup / dig
- DNS 문제 확인
- telnet / nc
- 특정 포트 열림 확인 → 방화벽 / L4 문제 체크
- Curl
- 실제 HTTP 요청 테스트
- 헤더/상태 코드 확인
- 서버 / 애플리케이션 로그
- CPU/RAM 스파이크
- DB 연결 오류
- API 타임 아웃
- Ping
- 로드 밸런서 쪽 문제 체크
- 특정 서버만 죽었는지
- 헬스 체크 실패 중인지
- LB 라우팅 전략 문제인지
- Sticky Session 때문에 특정 서버 과부하 인지
- 네트워크 패킷 레벨 확인(필요할 때만)
- Wireshark, tcpdump등을 활용하여 분석 가능 요소
- SYN 보내고 ACK 오는지
- TLS Handshake 실패 이유
- 패킷 재전송 잦은지
- 대역폭 포화인지
- Wireshark, tcpdump등을 활용하여 분석 가능 요소
- 근본 원인 분석
- 문제 현상과 실제 원인을 구분해야 함
- 예
- DB 응답 느림 → 실제 원인 : 네트워크 MTU mismatch
- 서비스 타임 아웃 → LB Health Check 설정 오류
- 재발 방지 대책 수립
- 모니터링 추가
- 프로메테우스, 그라파나
- 네트워크 지연값
- 오류율
- LB 별 토폴로지 모니터링
- 알림 기준 정의
- 시간 초과
- 오류율 상승
- 패킷 손실 증가
- 설정값 튜닝
- TCP 타임아웃
- LB Health Check 주기
- Keep-Alive
- 캐시 정책 보완
- 모니터링 추가
- 문제 범위 파악
-
CORS / CSRF / XSS 네트워크 관점
| 공격/정책 | 어떤 문제? | 네트워크 관점 포인트 | 방어 | | — | — | — | — | | CORS | 브라우저가 타 Origin 요청 제한 | 서버 응답 헤더 기반 허용 | Allow-Origin 설정 | | CSRF | 사용자의 쿠키를 악용한 요청 위조 | 브라우저의 자동 쿠키 전송 문제 | CSRF Token, SameSite | | XSS | 악성 JS 실행 | 서버가 악성 스크립트를 내려줌 | Escape, CSP |
- CORS (Cross-Origin Resource Sharing)
- 브라우저가 다른 오리진의 요청을 보안상 기본 차단하는 정책
- 오리진 = 프로토콜 + 도메인 + 포트
- 차단 이유
- 브라우저는 보안을 위해 자바 스크립트가 임의로 다른 사이트에 API 요청하는 것을 막기 때문
- 네트워크 동작 방식
- 서버에서
- 인증 필요한 경우
- 프록시 서버로 우회(Nginx/Backend Proxy)
- 중요 : 서버 보안 정책이지, 네트워크 연결 자체가 막힌 것이 아님
- 프록시나 curl로는 정상 호출 가능
- CSRF(Cross-Site Request Forgery)
- 사용자가 로그인된 상태를 악용해 서버가 원치 않는 요청을 수행하게 만드는 공격
- 공격 원리
- 사용자가 이미 A사이트에 로그인 → 쿠키 저장
- 공격자가 악성 사이트 제작
- 그 사이트에서 A사이트로 요청 보냄
- 브라우저는 자동으로 쿠키 포함
- 서버는 정상 요청처럼 처리됨 → 피해 발생
- 네트워크 관점 핵심
- CSRF는 브라우저의 자동 쿠키 전송을 악용
- 요청 자체는 정상 HTTP 요청이라 탐지 어렵다
- 서버가 누가 보냈는지 모름 → 사용자가 요청했다라고 인식
- 방어방법
- CSRF Token (요청마다 임의 토큰 포함)
- SameSite Cookie 설정
- Referer/Origin 검증
- JWT 기반 인증(쿠키 자동 전송 제거)
- XSS(Cross-Site Scripting)
- 웹페이지에 악성 스크립트를 삽입해 실행시키는 공격
- 공격 원리
- 공격자가 게시판/입력폼 등에 삽입
- 서버가 이를 제대로 필터링하지 않고 저장
- 다른 사용자가 페이지 방문시 → 악성 스크립트 실행
- 쿠키 탈취, 세션 탈취, 화면 위조 등 가능
- 네트워크 관점 핵심
- XSS느느 브라우저에서 자바스크립트가 실행되는 것이 문제
- 네트워크 프로토콜 자체 문제는 아님
- 즉 서버가 악성 코드 그대로 내려준 것이 원인
- 방어 방법
- 입력값 escape
- 출력 시 HTML Encoding
- CSP(Content Security Policy) 적용
- 쿠키에 HttpOnly 설정
- CORS (Cross-Origin Resource Sharing)
- 클라우드 VPC 기본(VPC, Subnet, SG, NAT, IGW)
- VPC(Virtual Private Cloud)
- 클라우드 환경에서 제공하는 사용자 전용 가상 네트워크
- 특징
- IP 대역을 내가 정의
- 서브넷 나누기 가능
- 보안 규칙, 라우팅, NAT 등 네트워크를 직접 구성
- 다른 고개 VPC와 완전히 격리
- 필요 이유
- 서비스 네트워크 구조를 직접 설계
- 내부망/외부망/DB망 분리
- 대규모 서비스 운영에 필수 구성 요소
- 서브넷
- VPC를 여러 범위로 쪼개어 서버가 속한 네트워크 영역을 분리하는 단위
- public subnet
- Internet Gateway(IGW)와 연결됨
- 외부 인터넷과 통신 가능
- 예 : 웹 서버, 리버스 프록시, 로드밸런서
- private subnet
- IGW와 직접 연결 X
- 외부로 나갈 필요 없음
- 예 : DB 서버, 내부 API 서버
- Internet Gateway(IGW)
- VPC가 인터넷과 통신할 수 있게 해주는 장치
- 역할
- Public Subnet의 서버가 인터넷에 접근할 수 있도록 연결
- 외부 사용자가 서비스로 접근 가능하게 함
- 특징
- 반드시 Public Subnet + 라우팅 테이블 설정이 필요
- Private Subnet은 IGW를 직접 사용할 수 없음
- NAT 게이트 웨이 / NAT 인스턴스
- Private Subnet 내부서버가 인터넷으로 나갈 수 있도록 해주는 장치
- 필요 이유
- DB 서버처럼 인터넷에서 접근되면 안되는 서버가
- 패치 다운로드, 외부 API 호출 등 아웃 바운드 트래픽이 필요할 때 활용
- 특징
- Private Subnet → NAT → IGW → 인터넷
- 외부에서 private Subnet 서버로 접근 불가(인바운드 차단)
- Security Group (SG)
- 서버(EC2) 단위로 적용되는 가상 방화벽
- 특징
- 포트/프로토콜/소스 IP 기반으로 허용만 설정(deny 없음)
- Stateful
- 서버 단위 보안
- 예
- 80/443 포트만 공개
- SSH(22)는 회사 고정 IP만 허용
- DB 포트는 API 서버 SG만 허용
- VPC(Virtual Private Cloud)
- CSR vs SSR
- CSR(Client Side Rendering)
- HTML 뼈대 + JS 내려받고, 브라우저에서 화면 그림
- 첫 로딩 느릴 수 있음, 이후 네비게이션 빠름
- SEO 불리(요즘은 개선됨), API 호출 많음
- SSR(Server Side Rendering)
- 서버에서 완성된 HTML 만들어서 내려줌
- 첫 페이지 로딩 빠름, SEO 유리
- 서버 부하 ↑, 렌더링 로직이 서버에 있음
- CSR(Client Side Rendering)
- URL 입력시 발생하는 일
- 브라우저 캐시/DNS 캐시 확인
- DNS 조회 → 도메인 → IP
- TCP 연결 (3-way handshake)
- HTTPS면 TLS Handshake
- HTTP 요청 전송 → 응답 수신
- HTML 파싱, CSS/JS/이미지 추가 요청
- 렌더 트리 구성 → 화면 그리기
- URL vs URI
- URI(Identifier): 자원을 식별하는 모든 식별자 (포괄 개념)
- 예:
mailto:abc@test.com,ftp://...,http://...
- 예:
- URL(Locator): 위치를 나타내는 URI
-
예:
https://example.com/path👉 실무에선 거의 URL ≈ URI처럼 쓰지만, 면접에선 URL ⊂ URI 라고 말하면 됨.
-
- URI(Identifier): 자원을 식별하는 모든 식별자 (포괄 개념)
- Web Cache
- 브라우저 캐시: 클라이언트 로컬 저장
- 프록시 캐시: 회사/ISP 중간에서 공용 캐시
- CDN 캐시: 전 세계 엣지 서버에 캐시
- 강력 캐시:
Cache-Control: max-age - 검증 캐시:
ETag / If-None-Match,Last-Modified
- Cookie vs Session vs Token(JWT)
- Cookie
- 브라우저에 저장, 자동으로 서버에 전송
- 주로 세션ID, 간단 플래그 저장
- Session
- 서버 메모리/스토리지에 사용자 상태 저장
- 클라이언트는
session_id만 쿠키로 들고 다님 - 서버 확장 시 세션 공유 필요(Redis 등)
- Token(JWT)
- 클라이언트가 토큰 자체를 보관(보통 LocalStorage/쿠키)
- 서버는 토큰 검증만, 상태 저장 X(Stateless)
- 마이크로서비스/모바일/외부 API에 유리
- Cookie
- SOP(Same Origin Policy) & CORS
- SOP
- 브라우저 보안 정책
- 도메인+포트+프로토콜이 다르면 JS로 접근 제한
- CORS
- SOP 예외를 허용하기 위한 메커니즘
-
서버가
Access-Control-Allow-Origin헤더로 허용 Origin 명시 - Preflight(OPTIONS) 요청으로 먼저 허가 받음
- SOP
- HTTP vs HTTPS vs Socket
- HTTP
- TCP 위에서 동작하는 요청/응답 프로토콜
- 평문(암호화 없음)
- HTTPS
- HTTP + TLS 암호화
- 기밀성, 무결성, 서버 인증 제공
- Socket (TCP/UDP Socket)
- 전송 계층 수준의 연결 단위
- HTTP/HTTPS/WebSocket 모두 결국 소켓 위에서 동작
- WebSocket: HTTP → 프로토콜 업그레이드 → 양방향 통신
- HTTP
- 암호화(단방향/양방향/HTTPS과정)
- 단방향(해시)
- 복호화 불가:
SHA-256,bcrypt - 비밀번호 저장 등에 사용
- 복호화 불가:
- 양방향 – 대칭키
- 암복호화에 같은 키 사용 (빠름)
- 키 공유가 문제
- 양방향 – 비대칭키
- 공개키/개인키 쌍
- 공개키로 암호화 → 개인키로 복호화
- 느리지만 키 교환에 사용
- HTTPS 과정(요약)
- 서버 인증서(공개키) 받음
- 클라이언트가 대칭키를 서버 공개키로 암호화해 전송
- 이후 데이터는 대칭키로 암호화해서 통신
- 단방향(해시)
- OAuth
- “비밀번호 안 주고, 다른 서비스가 내 계정에 접근하게 하는 방식”
- 역할:
- Resource Owner(유저)
- Client(앱)
- Authorization Server(로그인 창)
- Resource Server(API 서버)
- Authorization Code Flow(웹 기본)
- 클라이언트 → 인증서버 로그인 페이지로 리다이렉트
- 유저 로그인 & 동의
- 클라이언트는 Authorization Code 받음
- 그 코드로 Access Token 교환
- 토큰으로 API 호출
- 브라우저 저장소
- Cookie
- 자동 전송(도메인/Path/보안 설정에 따라)
- 용량 작음 (~4KB), 만료일 설정 가능
- 주로 인증/세션
- LocalStorage
- 도메인별로 영구 저장 (명시 삭제 전까지)
- 자동 전송 X (JS로만 접근)
- 용량 큼(수 MB 수준)
- SessionStorage
- 탭/창 단위 저장
- 탭 닫으면 삭제
- 자동 전송 X
- Cookie
- 서버 응답 코드
- 1xx: 정보(거의 안 씀)
- 2xx: 성공
200 OK,201 Created,204 No Content
- 3xx: 리다이렉트
301 Moved Permanently,302 Found,304 Not Modified
- 4xx: 클라이언트 오류
400 Bad Request,401 Unauthorized,403 Forbidden,404 Not Found
- 5xx: 서버 오류
500 Internal Server Error,502 Bad Gateway,503 Service Unavailable
- DHCP
- IP 주소 자동 할당 프로토콜
- DORA 과정
- Discover: 클라이언트 → “DHCP 서버 있나요?”
- Offer: 서버 → “이 IP 쓸래?”
- Request: 클라이언트 → “그 IP 주세요”
- Acknowledge: 서버 → “알겠어, 너꺼야”
- MAC 주소
- 네트워크 카드에 박힌 물리 주소 (L2)
AA:BB:CC:DD:EE:FF형태- 동일 LAN 내에서 프레임 목적지 식별
- IP는 논리 주소(L3), MAC은 물리 주소(L2)
- CSMA/CD vs CSMA/CA
- CSMA/CD (Ethernet 유선)
- 먼저 듣고(Carrier Sense) → 비어 있으면 전송
- 충돌 나면(Collision Detect) → 전송 중단 + 랜덤 대기 후 재전송
- 요즘 스위치/풀듀플렉스 환경에선 사실상 충돌 거의 없음
- CSMA/CA (Wi-Fi 무선)
- 충돌을 탐지하기 어려워 “피하는(Collision Avoid)” 방식
- 전송 전 랜덤 대기 + RTS/CTS 등으로 충돌 가능성 줄임
- CSMA/CD (Ethernet 유선)