코딩이야기𖦹/Node.js
📌 브라우저는 이렇게 통신하고 있었구만..
Dev디자인
2025. 5. 12. 14:58
웹 개발을 하다 보면 어느 순간 마주치는 개념들이 있음.
바로 '네트워크 구조', 'HTTPS', 'CORS' 같은 것들이다.
하나하나는 따로 배운 것 같은데, 막상 실제 서비스가 돌아가는 흐름 안에서는 전부 이어져 있었음.
그래서 이번 글에선 이 세 가지를 완전 초보자 눈높이에서 비유와 흐름을 중심으로 정리해보았다.
1️⃣ 웹에서 데이터는 어떤 구조로 오갈까?
웹에서 데이터를 주고받는 과정을 택배가 오가는 구조로 비유하면 이해가 쉽다.
✅ LAN, MAN, WAN은 거리 개념
| 네트워크 | 비유 | 설명 |
| LAN | 동네 배달 | 집 안, 회사 내부 등 가까운 거리에서 쓰는 네트워크. 빠르고 설치 쉬움 |
| MAN | 시내 배송 | 도시 단위의 네트워크. 여러 건물 연결. 대학 캠퍼스처럼 넓지만 연결된 공간 |
| WAN | 전국/국제 배송 | 전 세계적으로 데이터를 주고받음. 인터넷이 대표적 예시 |
→ 정리하면, LAN은 방 안 와이파이, WAN은 인터넷이라 보면 됨
✅ OSI 7계층은 택배가 전달되는 단계
1. 물리 계층 → 택배를 실제로 싣는 트럭이나 도로 (전기/광신호)
2. 데이터 링크 계층 → 같은 동네 안 배달 주소 (MAC 주소)
3. 네트워크 계층 → 전국 주소 확인 및 경로 설정 (IP 주소)
4. 전송 계층 → 상자 나누기, 번호 붙이기 (TCP/UDP)
5. 세션 계층 → 택배 기사와 고객이 전화로 연결 유지
6. 표현 계층 → 포장 방식, 언어 번역 (인코딩/암호화)
7. 응용 계층 → 우리가 실제 쓰는 앱 (브라우저, 이메일 등)
→ 데이터를 보내는 쪽은 상자를 포장하고, 받는 쪽은 포장을 뜯는 구조임 (캡슐화 ↔ 역캡슐화)
✅ 예시로 이해해보기
브라우저에서 www.naver.com 입력 시
- 입력한 URL → 응용 계층에서 처리됨
- 인코딩된 요청 → 표현 계층, 세션 계층을 거쳐 전송 계층에서 TCP로 잘게 나눔
- 네트워크 계층에서 IP 주소 설정 → 데이터 링크 계층에서 MAC 주소 붙임
- 물리 계층에서 진짜 케이블이나 전파로 전송됨 → 상대 서버까지 이동
→ 이 구조가 결국 모든 인터넷 요청의 기본 흐름이었음
2️⃣ HTTP랑 HTTPS는 뭐가 다른 걸까?
✅ HTTP는 그냥 열린 상자였음
- 기본 HTTP는 택배 상자에 아무 보호도 없이 글자가 그대로 써 있는 상태였음
- 누가 가로채도 내용을 바로 볼 수 있음
✅ HTTPS는 자물쇠를 걸고, 열쇠는 받는 사람만 갖고 있음
- 이때 쓰는 게 공개키/개인키 시스템임 (비대칭 암호화)
1. 서버가 자물쇠(공개키)를 배포함
2. 클라이언트는 그 자물쇠로 상자를 잠금
3. 서버만 그 자물쇠에 맞는 열쇠(개인키)로 열 수 있음
→ 이 과정을 통해 중간에 누가 가로채도 내용은 못 보게 되는 것
✅ 그다음은 대칭키 방식으로 빠르게 통신
- 자물쇠로 초기 연결을 안전하게 만든다.
- 클라이언트와 서버는 하나의 키(세션키)를 공유해서 빠르게 주고받는다. (대칭키 암호화)
✅ 정리
| 방식 | 특징 | 사용 시점 |
| 비대칭키 (공개/개인키) | 느리지만 안전 | 첫 연결, 세션키 주고받을 때 |
| 대칭키 (하나의 키) | 빠르지만 키 유출 시 위험 | 본격적인 데이터 전송 |
→ HTTPS는 이 둘을 섞어 '빠르고 안전한 통신'을 만든 것이다.
3️⃣ SOP랑 CORS, 실제로 무슨 일 하는 걸까?
✅ SOP(Same-Origin Policy): 내 건물 안에서만 출입 허용
- 브라우저는 기본적으로 **같은 출처(origin)**에서 온 요청만 허용함
- 여기서 출처란 → 프로토콜 + 도메인 + 포트
예) http://example.com:3000 과 https://example.com:443 → 다른 출처!
→ 마치 회사 출입증이 우리 회사에서만 작동하는 것과 같음
✅ CORS(Cross-Origin Resource Sharing): 보안 게이트 통과 허가증
- 다른 출처에서 요청할 수 있도록 서버가 허용해주는 구조
- 즉, 서버가 "얘는 출입 허락할게"라고 문서로 내주는 것임
✅ 실제 흐름
1. 클라이언트가 다른 출처에 요청 보냄
2. 브라우저가 OPTIONS 메서드로 먼저 허가 요청 (Preflight)
3. 서버가 허가 헤더 포함 응답:
- Access-Control-Allow-Origin
- Access-Control-Allow-Methods
- Access-Control-Allow-Headers
4. 브라우저가 본 요청 전송
5. 조건 충족 시 응답 받음, 아니면 에러 발생 (CORS 에러)
✅ 예시 코드 (Express)
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "http://localhost:3000");
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
res.header("Access-Control-Allow-Headers", "Content-Type, Authorization");
next();
});
✅ 마무리 정리
이 세 가지 개념은 하나의 흐름이다.
[데이터를 어떻게 보낼까?] → OSI 7계층
[어떻게 안전하게 보낼까?] → HTTPS
[다른 도메인끼리 주고받을 수 있나?] → CORS/SOP