✔ 빠른 속도
✔ 간단한 구현
✘ 보안 없음
✘ 데이터 평문 전송
✘ 중간자 공격 취약
포트: 80
암호화: 없음
Client Server
| |
| 1. HTTP Request |
| GET /index.html |
|----------------------->|
| |
| 2. HTTP Response |
| 200 OK |
| <html>...</html> |
|<-----------------------|
| |
데이터: 평문 전송 (누구나 읽을 수 있음) ✘
요청 (Request):
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
응답 (Response):
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<html>
<body>Hello World</body>
</html>
GET: 데이터 조회
POST: 데이터 생성
PUT: 데이터 전체 수정
PATCH: 데이터 일부 수정
DELETE: 데이터 삭제
HEAD: 헤더만 조회
OPTIONS: 지원 메서드 확인
1xx: 정보
- 100 Continue
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
✔ 데이터 암호화
✔ 무결성 보장
✔ 인증서로 신원 확인
✔ SEO 우대
✘ 약간 느림 (암호화 오버헤드)
✘ 인증서 비용
포트: 443
암호화: SSL/TLS
Client Server
| |
| 1. TCP 3-Way |
| Handshake |
|<---------------------->|
| |
| 2. SSL/TLS Handshake |
| - 인증서 확인 |
| - 암호화 방식 협상 |
| - 세션 키 생성 |
|<---------------------->|
| |
| 3. HTTP 통신 (암호화) |
| GET /index.html |
| (암호화된 데이터) |
|<---------------------->|
| |
데이터: 암호화 전송 (제3자가 읽을 수 없음) ✔
1. Client Hello:
- 지원하는 암호화 방식 목록
- 랜덤 데이터
2. Server Hello:
- 선택한 암호화 방식
- 서버 인증서 (공개키 포함)
- 랜덤 데이터
3. Client 인증서 검증:
- CA (인증 기관) 확인
- 유효 기간 확인
- 도메인 확인
4. 세션 키 생성:
- Client가 대칭키 생성
- 서버 공개키로 암호화하여 전송
5. 암호화 통신 시작:
- 대칭키로 데이터 암호화
- 빠른 속도 유지
비대칭 키 암호화 (공개키/개인키):
- 용도: 세션 키 교환
- 느림
- RSA, ECC
대칭 키 암호화:
- 용도: 실제 데이터 암호화
- 빠름
- AES, DES
하이브리드 방식:
1. 비대칭 키로 세션 키 교환 (안전)
2. 세션 키로 데이터 암호화 (빠름)
구성 요소:
- 도메인 정보
- 공개키
- 인증 기관(CA) 서명
- 유효 기간
종류:
1. DV (Domain Validation):
- 도메인 소유 확인만
- 저렴, 빠름
2. OV (Organization Validation):
- 조직 정보 확인
- 중간 수준
3. EV (Extended Validation):
- 엄격한 검증
- 주소창 녹색 표시
- 비싸고 오래 걸림
발급 기관 (CA):
- Let's Encrypt (무료)
- DigiCert
- Comodo
- GeoTrust
평문 데이터를 암호화하여 전송
예:
평문: "password123"
암호화: "3kd9fj2ksd9fj23k"
→ 중간자가 가로채도 해독 불가 ✔
데이터 변조 방지
해시 함수 사용:
- 데이터에서 해시 생성
- 수신자가 해시 재계산
- 같으면 변조 없음 ✔
예:
원본: "Hello" → 해시: abc123
변조: "World" → 해시: def456
→ 해시가 달라서 변조 감지
서버의 신원 확인
인증서로 확인:
- 서버가 주장하는 도메인이 맞는가?
- 신뢰할 수 있는 CA가 발급했는가?
- 유효 기간 내인가?
→ 피싱 사이트 방지 ✔
HTTP:
- 평문 통신
- 포트 80
- 빠르지만 보안 없음
HTTPS:
- 암호화 통신 (SSL/TLS)
- 포트 443
- 안전하지만 약간 느림
- 인증서 필요
차이점:
- 보안: HTTPS만 암호화
- SEO: HTTPS 우대
- 신뢰도: HTTPS 높음
HTTP (HyperText Transfer Protocol):
특징:
- 평문으로 데이터 전송
- 포트 80 사용
- 빠른 속도
- 구현 간단
문제점:
- 데이터 도청 가능
- 중간자 공격 취약
- 데이터 변조 가능
- 서버 신원 확인 불가
HTTPS (HTTP Secure):
특징:
- HTTP + SSL/TLS 암호화
- 포트 443 사용
- 데이터 암호화
- 인증서로 신원 확인
동작 원리:
1. TCP 연결 수립
2. SSL/TLS Handshake:
- 암호화 방식 협상
- 인증서 검증
- 세션 키 교환
3. 암호화된 HTTP 통신
암호화:
- 비대칭 키: 세션 키 교환
- 대칭 키: 데이터 암호화
- 하이브리드 방식 사용
보안 기능:
1. 암호화: 데이터 보호
2. 무결성: 변조 방지
3. 인증: 신원 확인
장점:
- 보안성 높음
- SEO 우대
- 사용자 신뢰
- 법적 요구사항 충족
단점:
- 약간의 성능 오버헤드
- 인증서 관리 필요
- 인증서 비용 (무료도 있음)
현재:
- 대부분의 웹사이트가 HTTPS 사용
- 브라우저에서 HTTP 경고 표시
- Let's Encrypt로 무료 인증서 제공