본문 바로가기

알토르

HTTP이란?

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 특징

  1. 무상태(Stateless)쿠키나 세션을 통해 상태 관리 가능
  2. 이전 요청 정보를 서버가 기억하지 않음
  3. 텍스트 기반
  4. 사람이 읽을 수 있는 문자열로 통신
  5. 확장 가능
  6. 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 전송 시 사용

핵심 요약

  1. Content-Type은 Body의 데이터 형식 정보를 HTTP 헤더로 알려주는 것
  2. 서버와 클라이언트 모두 받는 쪽이 데이터를 어떻게 해석할지 결정
  3. 오설정 시 파싱 오류, 400 오류, 클라이언트 렌더링 문제 발생
  4. 요청은 보내는 데이터, 응답은 받는 데이터 형식을 나타냄

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