IT Knowledge/Network/images/05-http와-https-venn.svg

HTTP와 HTTPS

HTTP는 인터넷에서 데이터를 주고받는 규칙이고, HTTPS는 그 암호화된 버전입니다.


🎯 이 파일을 학습하면 무엇을 알게 될까요?

이 파일을 학습하면 다음을 할 수 있게 됩니다:

  • HTTP와 HTTPS의 차이 이해
  • HTTP 메서드와 상태 코드 파악
  • HTTPS 암호화 원리 이해
  • HTTP 헤더의 역할 이해
  • 실제로 HTTP 통신을 디버깅할 수 있음

🧠 학습 전 생각해볼 질문

  1. HTTP와 HTTPS의 차이는 무엇일까요?

    • HTTPS의 ‘S’는 무엇을 의미할까요?
    • 왜 모든 웹사이트가 HTTPS를 사용하나요?
  2. HTTP 메서드는 왜 여러 개일까요?

    • GET과 POST의 차이는 무엇일까요?
    • 왜 DELETE, PUT 같은 메서드가 필요할까요?
  3. 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

특징GETPOST
용도데이터 조회데이터 생성/수정
데이터 위치URL 파라미터Request Body
보안낮음 (URL에 노출)높음 (Body에 숨김)
길이 제한있음 (URL 제한)없음
캐싱가능불가능
북마크가능불가능

예시

GET 요청:

GET /search?q=hello+world&page=1 HTTP/1.1
Host: example.com

POST 요청:

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.com

6.2 브라우저 개발자 도구

네트워크 탭 사용

1. F12 또는 Ctrl+Shift+I (개발자 도구 열기)
2. Network 탭 클릭
3. 페이지 새로고침
4. 요청/응답 확인

확인할 항목

항목확인 방법
요청 URLRequest 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 -issuer

6.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.1HTTP/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. 학습 후 생각해볼 질문

  1. 이 부분을 이해했나요?

    • HTTPS가 어떻게 암호화되는지 설명할 수 있나요?
    • TLS 핸드셰이크 과정을 단계별로 설명할 수 있나요?
  2. 어떻게 확인하지?

    • curl -v로 상세한 요청/응답을 확인해보세요.
    • 브라우저 개발자 도구에서 실제 통신을 분석해보세요.
  3. 무엇이 가장 어려웠나요?

    • TLS 핸드셰이크 과정이 복잡하지 않았나요?
  4. 어떻게 개선할까요?

    • 실제로 SSL 인증서를 발급받고 적용해보세요.

🔗 관련 노트


마지막 업데이트: 2026-01-29 다음 단계: 로드 밸런싱과 리버스 프록시 학습