IT Knowledge/Network/images/05-http와-https-venn.svg
HTTP와 HTTPS
HTTP는 인터넷에서 데이터를 주고받는 규칙이고, HTTPS는 그 암호화된 버전입니다.
🎯 이 파일을 학습하면 무엇을 알게 될까요?
이 파일을 학습하면 다음을 할 수 있게 됩니다:
- HTTP와 HTTPS의 차이 이해
- HTTP 메서드와 상태 코드 파악
- HTTPS 암호화 원리 이해
- HTTP 헤더의 역할 이해
- 실제로 HTTP 통신을 디버깅할 수 있음
🧠 학습 전 생각해볼 질문
-
HTTP와 HTTPS의 차이는 무엇일까요?
- HTTPS의 ‘S’는 무엇을 의미할까요?
- 왜 모든 웹사이트가 HTTPS를 사용하나요?
-
HTTP 메서드는 왜 여러 개일까요?
- GET과 POST의 차이는 무엇일까요?
- 왜 DELETE, PUT 같은 메서드가 필요할까요?
-
HTTPS는 어떻게 안전할까요?
- 누군가 데이터를 가로채면 어떻게 될까요?
- 암호화는 어떻게 이루어질까요?
📖 1. HTTP란 무엇인가?
1.1 HTTP의 정의
**HTTP (HyperText Transfer Protocol)**는 웹상에서 데이터를 전송하는 프로토콜입니다.
비유: 편지 시스템
- HTTP = 편지 전송 규칙
- 클라이언트 = 편지를 보내는 사람
- 서버 = 편지를 받는 사람
1.2 HTTP의 특징
1. 비연결성 (Stateless)
요청 1: "안녕하세요"
응답 1: "반갑습니다"
요청 2: "누구세요?" ← 이전 요청을 기억하지 못함
응답 2: "서버입니다"
문제점: 사용자 정보를 계속 다시 보내야 함
해결: 쿠키(Cookie)와 세션(Session) 사용
2. 요청/응답 모델
클라이언트 서버
│ │
│ ── 요청 ──→ │
│ │
│ ←── 응답 ── │
🔍 2. HTTP 메서드
2.1 기본 HTTP 메서드
| 메서드 | 역할 | 예시 | 비유 |
|---|---|---|---|
| GET | 데이터 조회 | GET /users | 책 찾기 |
| POST | 데이터 생성 | POST /users | 새 글 작성 |
| PUT | 데이터 전체 수정 | PUT /users/1 | 책 전체 교체 |
| PATCH | 데이터 일부 수정 | PATCH /users/1 | 책 일부 수정 |
| DELETE | 데이터 삭제 | DELETE /users/1 | 책 버리기 |
| HEAD | 헤더만 조회 | HEAD /users | 책 정보만 확인 |
| OPTIONS | 허용된 메서드 확인 | OPTIONS /users | 가능한 작업 확인 |
2.2 GET vs POST
| 특징 | GET | POST |
|---|---|---|
| 용도 | 데이터 조회 | 데이터 생성/수정 |
| 데이터 위치 | URL 파라미터 | Request Body |
| 보안 | 낮음 (URL에 노출) | 높음 (Body에 숨김) |
| 길이 제한 | 있음 (URL 제한) | 없음 |
| 캐싱 | 가능 | 불가능 |
| 북마크 | 가능 | 불가능 |
예시
GET 요청:
GET /search?q=hello+world&page=1 HTTP/1.1
Host: example.comPOST 요청:
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "john@example.com"
}📊 3. HTTP 상태 코드
3.1 상태 코드 분류
| 범위 | 의미 | 예시 |
|---|---|---|
| 2xx | 성공 | 200 OK |
| 3xx | 리다이렉션 | 301 Moved Permanently |
| 4xx | 클라이언트 오류 | 404 Not Found |
| 5xx | 서버 오류 | 500 Internal Server Error |
3.2 주요 상태 코드
2xx: 성공
| 코드 | 의미 | 설명 |
|---|---|---|
| 200 OK | 성공 | 요청이 성공적으로 처리됨 |
| 201 Created | 생성됨 | 리소스가 성공적으로 생성됨 |
| 204 No Content | 콘텐츠 없음 | 성공했지만 반환할 데이터 없음 |
3xx: 리다이렉션
| 코드 | 의미 | 설명 |
|---|---|---|
| 301 Moved Permanently | 영구적 이동 | URL이 영구적으로 변경됨 |
| 302 Found | 임시 이동 | URL이 임시로 변경됨 |
| 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 | 서비스 불가 | 서버 과부하 |
📋 4. HTTP 헤더
4.1 요청 헤더
| 헤더 | 역할 | 예시 |
|---|---|---|
| Host | 호스트 명 | Host: example.com |
| User-Agent | 클라이언트 정보 | User-Agent: Mozilla/5.0 |
| Accept | 받을 수 있는 콘텐츠 | Accept: text/html |
| Content-Type | 보내는 데이터 타입 | Content-Type: application/json |
| Authorization | 인증 정보 | Authorization: Bearer token |
| Cookie | 쿠키 데이터 | Cookie: session=abc123 |
4.2 응답 헤더
| 헤더 | 역할 | 예시 |
|---|---|---|
| Content-Type | 응답 데이터 타입 | Content-Type: text/html |
| Content-Length | 응답 데이터 길이 | Content-Length: 1234 |
| Server | 서버 정보 | Server: nginx/1.18.0 |
| Set-Cookie | 쿠키 설정 | Set-Cookie: session=abc123 |
| Cache-Control | 캐싱 정책 | Cache-Control: max-age=3600 |
4.3 요청/응답 예시
요청:
GET /api/users/1 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Cookie: session=abc123응답:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 123
Server: nginx/1.18.0
Set-Cookie: session=def456; HttpOnly; Secure
{
"id": 1,
"name": "John Doe",
"email": "john@example.com"
}🔒 5. HTTPS와 암호화
5.1 HTTPS란?
**HTTPS (HTTP Secure)**는 SSL/TLS를 사용하여 암호화된 HTTP입니다.
HTTP: 평문 (누구나 읽을 수 있음)
HTTPS: 암호화 (오직 보낸 사람과 받은 사람만 읽을 수 있음)
5.2 HTTPS 동작 원리 (TLS Handshake)
sequenceDiagram participant Client as 클라이언트 participant Server as 서버 Client->>Server: Client Hello (암호화 알고리즘 요청) Server->>Client: Server Hello + 인증서 Client->>Client: 인증서 검증 Client->>Server: Client Key Exchange (세션 키 생성) Server->>Client: Server Key Exchange Note over Client,Server: 보안 연결 완료 Client->>Server: 암호화된 데이터 Server->>Client: 암호화된 데이터
단계별 설명
1단계: Client Hello
클라이언트: "서버야, 암호화 방식은 이런 게 좋아!"
- 클라이언트가 지원하는 암호화 알고리즘 전송
- 무작위 숫자 전송
2단계: Server Hello + 인증서
서버: "알겠어! 이 인증서도 줄게!"
- 선택된 암호화 알고리즘 응답
- SSL 인증서 전송
- 무작위 숫자 전송
3단계: 인증서 검증
클라이언트: "이 인증서 진짜인지 확인해보자"
- CA(Certificate Authority) 확인
- 도메인 일치 확인
- 만료 확인
4단계: 키 교환
클라이언트/서버: "세션 키를 만들자!"
- 프리마스터 시크릿 생성
- 세션 키 생성
- 대칭키 암호화 사용
5단계: 보안 통신
클라이언트 ↔ 서버: "이제 안전하게 통신하자!"
- 세션 키로 데이터 암호화
- 보안 데이터 전송
5.3 SSL/TLS 버전
| 버전 | 상태 | 보안 수준 |
|---|---|---|
| SSL 2.0/3.0 | 폐기됨 | 취약함 |
| TLS 1.0/1.1 | 폐기됨 | 취약함 |
| TLS 1.2 | 사용 중 | 안전 |
| TLS 1.3 | 사용 중 | 매우 안전 |
🛠️ 6. 실무에서의 HTTP/HTTPS 활용
6.1 HTTP 요청/응답 디버깅
curl 명령어
# 기본 GET 요청
curl https://example.com
# 헤더만 요청
curl -I https://example.com
# POST 요청
curl -X POST https://example.com/api/users \
-H "Content-Type: application/json" \
-d '{"name":"John","email":"john@example.com"}'
# 인증 포함 요청
curl -H "Authorization: Bearer token" https://example.com/api/users
# 인증서 무시 (테스트용)
curl -k https://example.com6.2 브라우저 개발자 도구
네트워크 탭 사용
1. F12 또는 Ctrl+Shift+I (개발자 도구 열기)
2. Network 탭 클릭
3. 페이지 새로고침
4. 요청/응답 확인
확인할 항목
| 항목 | 확인 방법 |
|---|---|
| 요청 URL | Request URL |
| 메서드 | Request Method |
| 상태 코드 | Status Code |
| 요청 헤더 | Request Headers |
| 응답 헤더 | Response Headers |
| 응답 데이터 | Response |
6.3 HTTPS 인증서 확인
openssl 명령어
# 인증서 정보 확인
openssl s_client -connect example.com:443 -servername example.com
# 인증서 유효기간 확인
openssl x509 -in cert.pem -noout -dates
# 인증서 발급자 확인
openssl x509 -in cert.pem -noout -issuer6.4 HTTP 헤더 보안 설정
Apache 설정
<IfModule mod_headers.c>
# X-Frame-Options: 클릭재킹 방지
Header always set X-Frame-Options "SAMEORIGIN"
# X-Content-Type-Options: MIME 스니핑 방지
Header always set X-Content-Type-Options "nosniff"
# X-XSS-Protection: XSS 필터
Header always set X-XSS-Protection "1; mode=block"
# Strict-Transport-Security: HTTPS 강제
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>Nginx 설정
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;🎓 7. 심화 주제
7.1 HTTP/2
HTTP/2 특징
| 특징 | HTTP/1.1 | HTTP/2 |
|---|---|---|
| 연결 | 한 번에 1개 요청 | 멀티플렉싱 |
| 압축 | 헤더 미압축 | HPACK 압축 |
| 서버 푸시 | 지원 안 함 | 지원 |
| 이진 프로토콜 | 텍스트 | 이진 |
7.2 HTTP/3
HTTP/3 특징
- 프로토콜: QUIC (UDP 기반)
- 장점: 연결 설정 빠름, 헤드 오브 라인 블로킹 없음
- 단점: 구현 복잡, 보안 문제 가능성
✅ 8. 학습 체크리스트
기초 개념
- HTTP의 정의와 특징 이해
- 비연결성(Stateless) 이해
- 요청/응답 모델 이해
HTTP 메서드
- GET 메서드 역할 이해
- POST 메서드 역할 이해
- PUT, PATCH, DELETE 메서드 역할 이해
상태 코드
- 2xx 상태 코드 이해
- 3xx 상태 코드 이해
- 4xx 상태 코드 이해
- 5xx 상태 코드 이해
HTTPS
- HTTPS가 필요한 이유 이해
- TLS 핸드셰이크 과정 이해
- SSL/TLS 버전 이해
실무 활용
- curl로 HTTP 요청 가능
- 브라우저 개발자 도구 사용 가능
- HTTPS 인증서 확인 가능
🧪 9. 실습 연습
연습 1: HTTP 메서드 테스트
# GET 요청
curl -X GET https://jsonplaceholder.typicode.com/posts/1
# POST 요청
curl -X POST https://jsonplaceholder.typicode.com/posts \
-H "Content-Type: application/json" \
-d '{"title":"Test","body":"Test body","userId":1}'
# PUT 요청
curl -X PUT https://jsonplaceholder.typicode.com/posts/1 \
-H "Content-Type: application/json" \
-d '{"title":"Updated","body":"Updated body","userId":1}'
# DELETE 요청
curl -X DELETE https://jsonplaceholder.typicode.com/posts/1연습 2: 상태 코드 확인
# 200 OK 확인
curl -I https://example.com
# 404 확인
curl -I https://example.com/notfound
# 301 리다이렉션 확인
curl -I http://example.com연습 3: HTTPS 인증서 확인
# 인증서 정보 확인
openssl s_client -connect google.com:443 -servername google.com
# 인증서 만료일 확인
echo | openssl s_client -connect google.com:443 2>/dev/null | openssl x509 -noout -dates💡 10. 학습 후 생각해볼 질문
-
이 부분을 이해했나요?
- HTTPS가 어떻게 암호화되는지 설명할 수 있나요?
- TLS 핸드셰이크 과정을 단계별로 설명할 수 있나요?
-
어떻게 확인하지?
curl -v로 상세한 요청/응답을 확인해보세요.- 브라우저 개발자 도구에서 실제 통신을 분석해보세요.
-
무엇이 가장 어려웠나요?
- TLS 핸드셰이크 과정이 복잡하지 않았나요?
-
어떻게 개선할까요?
- 실제로 SSL 인증서를 발급받고 적용해보세요.
🔗 관련 노트
마지막 업데이트: 2026-01-29 다음 단계: 로드 밸런싱과 리버스 프록시 학습