HTTP
1. HTTP란?
- HTTP(HyperText Transfer Protocol)는 웹 브라우저와 서버가 데이터를 주고받는 규칙
- HyperText: 웹페이지 문서(HTML) 중심
- Transfer: 데이터를 주고받음
- Protocol: 통신 규칙
웹 브라우저(클라이언트) ↔ 서버 사이의 요청(Request)과 응답(Response) 구조
2. HTTP 요청 메서드(Method)
메서드설명특징/사용 예시| GET | 서버에서 리소스 조회 | URL에 파라미터 포함 가능 (?key=value), 브라우저 주소창으로도 접근, 데이터 수정 불가 |
| POST | 서버에 데이터 생성/전송 | Body에 데이터 포함, 로그인, 회원가입, API 데이터 전송 |
| PUT | 서버 리소스 전체 수정 | 특정 리소스를 새 데이터로 완전히 교체, idempotent (같은 요청 반복해도 결과 동일) |
| PATCH | 서버 리소스 일부 수정 | 리소스 일부만 수정, PUT보다 유연 |
| DELETE | 서버 리소스 삭제 | 특정 리소스를 제거 |
| HEAD | GET과 동일하지만 Body 제외 | 상태 확인, 헤더 정보만 필요할 때 |
| OPTIONS | 서버가 지원하는 메서드 조회 | CORS 확인 등, 서버가 허용하는 메서드 반환 |
3. HTTP의 기본 구조
① 요청(Request)
클라이언트가 서버에 보내는 메시지
GET /cloud HTTP/1.1
Host: 10.230.10.20:9199
User-Agent: curl/7.81.0
Accept: */*
GET → 요청 방식(메서드)
/cloud → 요청할 리소스(페이지, API)
Host → 요청할 서버
User-Agent → 요청하는 클라이언트 정보
② 응답(Response)
서버가 클라이언트에 보내는 메시지
HTTP/1.1 301 Moved Permanently
Location: /prom-cloud/
Content-Type: text/html; charset=utf-8
301 Moved Permanently → 상태 코드(Status Code)
Location → 리다이렉트될 URL
Content-Type → 데이터 종류 (HTML, JSON 등)
4. HTTP 요청 예시
① GET 요청
curl -X GET http://example.com/api/user?id=123
- 서버에서 id=123 사용자 정보 조회
- URL 뒤에 파라미터 붙임
② POST 요청 (JSON)
curl -X POST http://example.com/api/user \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"1234"}'
- 서버에 새로운 사용자 생성
- Body에 JSON 데이터 포함
③ POST 요청 (폼 데이터)
curl -X POST http://example.com/login \
-d "username=test&password=1234"
- application/x-www-form-urlencoded 형식
- HTML 폼 제출과 동일
5. 주요 HTTP 상태 코드
코드 범위의미설명예시| 1xx | 정보 응답 | 요청을 받았으며 처리를 계속함 | 100 Continue |
| 2xx | 성공 | 요청 성공, 서버가 정상 응답 | 200 OK, 201 Created |
| 3xx | 리다이렉트 | 다른 URL로 이동 필요 | 301 Moved Permanently, 302 Found |
| 4xx | 클라이언트 오류 | 요청에 문제가 있음 | 400 Bad Request, 401 Unauthorized, 404 Not Found |
| 5xx | 서버 오류 | 서버 처리 중 오류 발생 | 500 Internal Server Error, 503 Service Unavailable |
5-1. 주요 상태 코드
① 2xx 성공
- 200 OK → 요청 성공, 리소스 반환
- 201 Created → 새로운 리소스 생성 완료
- 204 No Content → 요청 성공, 반환할 내용 없음
② 3xx 리다이렉트
- 301 Moved Permanently → URL 영구 이동
- 302 Found → 임시 이동
- 304 Not Modified → 캐시된 내용 사용 가능
③ 4xx 클라이언트 오류
- 400 Bad Request → 요청 형식 오류
- 401 Unauthorized → 인증 필요
- 403 Forbidden → 접근 권한 없음
- 404 Not Found → 요청한 리소스 없음
- 429 Too Many Requests → 요청 과다
④ 5xx 서버 오류
- 500 Internal Server Error → 서버 내부 오류
- 502 Bad Gateway → 게이트웨이/프록시 오류
- 503 Service Unavailable → 서버 과부하, 일시적 사용 불가
- 504 Gateway Timeout → 게이트웨이/프록시 시간 초과
6. HTTP 특징
- 무상태(Stateless)쿠키나 세션을 통해 상태 관리 가능
- 이전 요청 정보를 서버가 기억하지 않음
- 텍스트 기반
- 사람이 읽을 수 있는 문자열로 통신
- 확장 가능
- Header로 다양한 정보 전달 가능
💡 간단 요약:
- HTTP = 웹 브라우저 ↔ 서버가 데이터를 주고받는 규칙, 요청/응답 구조, 상태 코드로 결과 알림
* HTTP 통신 시 데이터 형태
1️⃣ 주요 Content-Type 종류
Content-Type설명사용 예시| application/x-www-form-urlencoded | 기본 HTML 폼 전송 방식. 키=값&키=값 형태로 데이터 전달 | 로그인 폼, 간단한 데이터 전송 |
| multipart/form-data | 파일 업로드용. 각 필드가 구분되어 전송 | 이미지, PDF 등 파일 + 텍스트 함께 전송 |
| application/json | JSON 형식으로 데이터 전달 | API 서버 통신, REST API |
| text/plain | 단순 텍스트 전송 | 간단한 메시지, 디버깅용 |
| application/xml | XML 형식 데이터 전송 | SOAP API 등 |
| application/octet-stream | 바이너리 데이터 전송 | 파일 다운로드, 바이너리 파일 업로드 |
| application/javascript | JS 코드 전송 | JSONP 같은 오래된 방식 |
| application/x-msgpack | 바이너리 직렬화 형식 | 고성능 API 전송 시 사용 |
핵심 요약
- Content-Type은 Body의 데이터 형식 정보를 HTTP 헤더로 알려주는 것
- 서버와 클라이언트 모두 받는 쪽이 데이터를 어떻게 해석할지 결정
- 오설정 시 파싱 오류, 400 오류, 클라이언트 렌더링 문제 발생
- 요청은 보내는 데이터, 응답은 받는 데이터 형식을 나타냄
2️⃣ 브라우저/클라이언트 사용 방식 예시
① HTML 폼 전송
<form action="/login" method="POST">
<input type="text" name="username">
<input type="password" name="password">
<button type="submit">Login</button>
</form>
디폴트: application/x-www-form-urlencoded
파일 포함 시: multipart/form-data
② JSON API 요청
curl -X POST http://server/api \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"1234"}'
- 서버가 JSON 파싱 가능해야 함
- REST API, SPA, 모바일 앱에서 주로 사용
③ 파일 업로드
curl -X POST http://server/upload \
-F "file=@image.png" \
-F "description=sample"
- -F 옵션 → multipart/form-data
- 파일 + 텍스트 동시 전송 가능
💡 정리 포인트
단순 텍스트/키-값 → application/x-www-form-urlencoded
파일 포함 → multipart/form-data
JSON 데이터 → application/json
서버가 Content-Type에 따라 데이터 파싱 방법 결정
Flask 요청
1️⃣ GET 요청
- 특징: URL에 파라미터 포함 (?key=value&key2=value2)
Flask에서 접근: request.args
from flask import Flask, request
app = Flask(__name__)
@app.route('/search', methods=['GET'])
def search():
query = request.args.get('q') # URL 파라미터 q
page = request.args.get('page', 1) # 기본값 1
return f"검색어: {query}, 페이지: {page}"
# 예시 URL: /search?q=python&page=2
- request.args → ImmutableMultiDict, URL 쿼리 스트링 읽기
2️⃣ POST 요청
① application/x-www-form-urlencoded (HTML 폼 기본)
Flask에서 접근: request.form
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
return f"{username} 로그인 시도"
- 브라우저 HTML 폼 제출 시 기본 방식
② multipart/form-data (파일 업로드 포함 폼)
Flask에서 접근: request.form + request.files
@app.route('/upload', methods=['POST'])
def upload():
description = request.form.get('description')
file = request.files['file'] # 파일 객체
filename = file.filename
file.save(f'./uploads/{filename}')
return f"{filename} 업로드 완료: {description}"
request.files['file'] → FileStorage 객체
③ application/json (REST API, SPA)
Flask에서 접근: request.json 또는 request.get_json()
@app.route('/api/user', methods=['POST'])
def api_user():
data = request.get_json()
username = data['username']
password = data['password']
return f"{username} API 생성 완료"
클라이언트가 Content-Type: application/json으로 전송해야 함
3️⃣ PUT, PATCH, DELETE
PUT/PATCH: request.get_json()로 수정할 데이터를 받음
DELETE: URL 파라미터(request.args)나 JSON으로 식별자 전달
@app.route('/api/user/<int:id>', methods=['DELETE'])
def delete_user(id):
# id 기반 삭제
return f"User {id} 삭제 완료"
🔑 핵심 포인트
GET → URL 쿼리 파라미터 (request.args)
POST / PUT / PATCH → Content-Type 따라 다름
application/x-www-form-urlencoded → request.form
multipart/form-data → request.form + request.files
application/json → request.get_json()
DELETE → URL 파라미터 또는 JSON
'알토르' 카테고리의 다른 글
| 알토르 3주차 - Fetch / Axios (0) | 2026.05.10 |
|---|---|
| 알토르 3주차 API Endpoint (0) | 2026.05.10 |
| 알토르 React ERROR - troubleshooting (0) | 2026.05.08 |
| 알토르 2주차 Python/Flask/API (0) | 2026.05.07 |
| Git / Github (0) | 2026.05.06 |