HTTP

2025. 3. 5. 01:41·개발/HTTP

브라우저, 서버, HTTP: 웹 동작 방식 이해하기

.doc 파일을 열기 위해 MS 워드가 필요한 것처럼, 웹 페이지(HTML, CSS, JavaScript 등)를 보려면 웹 브라우저가 필요하다. 하지만 웹 페이지는 보통 내 컴퓨터가 아닌, 인터넷 어딘가에 있는 "서버"라는 컴퓨터에 저장되어 있다. 브라우저가 서버에 웹 페이지를 요청하고, 서버가 응답하여 웹 페이지를 브라우저에 보여주는 과정에는 "HTTP"라는 규칙이 사용된다.

  • HTTP: 브라우저와 서버가 서로 대화하기 위해 사용하는 "언어" 또는 "통신 규칙".
  • 브라우저: 사용자의 요청을 HTTP를 사용하여 서버에 전달하고 그에따라 사용자에게 웹 페이지를 보여주는 "프로그램".
  • 서버: 브라우저의 요청을 받아, HTTP를 사용하여 응답하는 제공하는 "컴퓨터" 또는 "프로그램". 

HTTP의 핵심 특징

  1. 클라이언트-서버 모델 (Client-Server Model):
    • HTTP는 클라이언트-서버 구조.
    • 클라이언트 (Client): 웹 브라우저, 모바일 앱 등과 같이 서비스를 요청하는 쪽.
    • 서버 (Server): 웹 서버, API 서버 등과 같이 요청에 대한 응답을 제공하는 쪽.
    • 클라이언트가 서버에 요청(Request)을 보내면, 서버는 요청을 처리하고 응답(Response)을 반환.
  2. 무상태 프로토콜 (Stateless Protocol):
    • HTTP는 기본적으로 무상태(stateless) 프로토콜. 즉, 서버는 클라이언트의 이전 요청에 대한 정보를 기억하지 않는다.
    • 각 요청은 독립적으로 처리되며, 이전 요청과 연결되지 않는다.
    • 이러한 특징은 서버의 확장성(scalability)을 높이는 데 기여하지만, 사용자 인증이나 세션 관리와 같은 기능을 구현하기 위해서는 추가적인 기술(쿠키, 세션, 토큰 등)이 필요.
  3. 요청/응답 (Request/Response):
    • HTTP 통신은 클라이언트의 요청(Request)과 서버의 응답(Response)으로 구성된다.
    • 요청 (Request):
      • 메서드 (Method): 서버에 수행할 작업을 지정. (예: GET, POST, PUT, DELETE 등)
      • URL (Uniform Resource Locator): 요청하는 리소스(자원)의 위치.
      • 헤더 (Headers): 요청에 대한 추가 정보(메타데이터). (예: 클라이언트 종류, 콘텐츠 타입 등)
      • 본문 (Body): 서버에 전송할 데이터. (POST, PUT 요청에서 사용, GET 방식에서는 쿼리스트링)
    • 응답 (Response):
      • 상태 코드 (Status Code): 요청 처리 결과를 나타내는 세 자리 숫자. (예: 200 OK, 404 Not Found, 500 Internal Server Error 등)
      • 헤더 (Headers): 응답에 대한 추가 정보(메타데이터). (예: 콘텐츠 타입, 콘텐츠 길이 등)
      • 본문 (Body): 서버가 클라이언트에 전송하는 데이터(HTML, JSON, 이미지 등).

HTTP 메서드 (HTTP Methods)

  • GET: 리소스(정보)를 요청. (예: 웹 페이지, 이미지 가져오기)
    • 가장 일반적인 메서드.
    • 요청 데이터는 URL의 쿼리 파라미터(?key=value&key2=value2...)를 통해 전달.
    • 멱등성(Idempotent): 동일한 GET 요청을 여러 번 보내도 서버의 상태가 변경되지 않는다.
  • POST: 데이터를 서버에 전송하여 리소스를 생성하거나 변경. (예: 회원 가입, 글 작성)
    • 요청 데이터는 요청 본문(body)에 담겨 전달된다.
    • URL에 데이터가 노출되지 않아 보안에 더 유리.
    • 멱등성을 보장하지 않는다. (동일한 POST 요청을 여러 번 보내면 서버의 상태가 변경될 수 있다.)
  • PUT: 리소스 전체를 수정. (예: 게시물 전체 내용 수정)
    • 멱등성을 가짐. (동일한 PUT 요청을 여러 번 보내도 결과는 동일)
    • PUT과 PATCH는 비슷하지만, PUT은 전체를 덮어쓰는 방식이고, PATCH는 일부만 수정하는 방식.
  • DELETE: 리소스를 삭제합니다. (예: 게시물 삭제)
    • 멱등성을 가짐.
  • PATCH: 리소스의 일부를 수정. (예: 게시물의 제목만 수정)
    • 멱등성을 가질 수도 있고, 가지지 않을 수도 있다. (서버 구현에 따라 다름)
  • HEAD: GET과 유사하지만, 응답 본문(body)은 받지 않고 헤더 정보만 받는다. (리소스 존재 여부, 메타데이터 확인)
  • OPTIONS: 서버가 지원하는 메서드 목록을 확인. (CORS에서 사용)

HTTP 상태 코드 (HTTP Status Codes)

HTTP 상태 코드는 서버가 클라이언트의 요청을 어떻게 처리했는지 알려주는 세 자리 숫자.

  • 1xx (Informational): 정보 제공 (요청을 받았고 처리를 계속함)
  • 2xx (Successful): 성공 (요청을 성공적으로 처리함)
    • 200 OK: 요청 성공
    • 201 Created: 리소스 생성 성공 (주로 POST 요청에 대한 응답)
    • 204 No Content: 요청은 성공했지만, 응답 본문이 없음
  • 3xx (Redirection): 리디렉션 (요청 완료를 위해 추가 조치가 필요함)
    • 301 Moved Permanently: 요청한 리소스가 영구적으로 이동됨
    • 302 Found: 요청한 리소스가 일시적으로 이동됨
    • 304 Not Modified: 클라이언트가 캐시된 리소스를 사용해도 됨
  • 4xx (Client Error): 클라이언트 오류 (요청에 문제가 있음)
    • 400 Bad Request: 잘못된 요청
    • 401 Unauthorized: 인증되지 않은 요청 (로그인 필요)
    • 403 Forbidden: 접근 권한 없음
    • 404 Not Found: 요청한 리소스를 찾을 수 없음
    • 405 Method Not Allowed: 허용되지 않는 메서드 사용
  • 5xx (Server Error): 서버 오류 (서버에서 요청 처리 중 오류 발생)
    • 500 Internal Server Error: 서버 내부 오류
    • 502 Bad Gateway: 게이트웨이 또는 프록시 서버에서 잘못된 응답을 받음
    • 503 Service Unavailable: 서버가 일시적으로 서비스를 제공할 수 없음

요청 헤더 (Request Headers)

요청 헤더는 클라이언트가 서버에 보내는 요청에 대한 부가적인 정보를 담고 있습니다.

  1. 일반 헤더 (General Headers):
    • Connection: 클라이언트와 서버 간의 연결 방식 지정
      • Connection: keep-alive (지속적인 연결 사용)
      • Connection: close (연결 종료)
    • Upgrade-Insecure-Requests: HTTPS로 업그레이드 요청
      • Upgrade-Insecure-Requests: 1
    • Cache-Control: 캐싱 제어, no-store, no-cache. max-age 등
  2. 요청 헤더 (Request Headers):
    • Host: 요청하는 서버의 호스트 이름과 포트 번호 (필수)
      • Host: www.example.com
    • User-Agent: 클라이언트의 종류(웹 브라우저, 운영체제 등)
      • User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
    • Accept: 클라이언트가 처리 가능한 콘텐츠 타입 (MIME 타입)
      • Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 (HTML, XML 등 수용)
    • Accept-Encoding: 클라이언트가 지원하는 압축 방식
      • Accept-Encoding: gzip, deflate, br (gzip, deflate, br 압축 지원)
    • Accept-Language: 클라이언트가 선호하는 언어
      • Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 (한국어 우선)
    • Referer: 현재 요청을 보낸 페이지의 URL (이전 페이지)
      • Referer: https://www.example.com/previous-page
    • Cookie: 서버에 의해 설정된 쿠키를 다시 서버로 보냄
      • Cookie: name=value; name2=value2
    • Authorization: 인증 토큰(JWT 등)을 서버에 보낼 때 사용.
      • Authorization: Bearer <token>
  3. 엔터티 헤더 (Entity Headers, 요청 본문에 대한 정보):
    • Content-Type: 요청 본문(body)의 콘텐츠 타입 (MIME 타입)
      • Content-Type: application/json (JSON 형식)
      • Content-Type: application/x-www-form-urlencoded (Form 데이터)
      • Content-Type: multipart/form-data (파일 업로드)
    • Content-Length: 요청 본문의 길이 (바이트 단위)
      • Content-Length: 1234
    • Content-Encoding: 요청 본문의 압축 방식
      • Content-Encoding: gzip

응답 헤더 (Response Headers)

응답 헤더는 서버가 클라이언트에 보내는 응답에 대한 부가적인 정보를 담고 있습니다.

  1. 일반 헤더 (General Headers):
    • Connection: (요청 헤더와 동일)
    • Date: 응답이 생성된 날짜와 시간
      • Date: Tue, 23 Apr 2024 15:30:00 GMT
  2. 응답 헤더 (Response Headers):
    • Server: 서버의 종류
      • Server: Apache/2.4.41 (Unix)
    • Set-Cookie: 클라이언트에 쿠키를 설정
      • Set-Cookie: name=value; Expires=Wed, 24 Apr 2025 15:30:00 GMT; Path=/; HttpOnly
    • Location: 3xx 응답 (리디렉션)에서 리디렉션할 URL
      • Location: https://www.example.com/new-page
    • Access-Control-Allow-Origin: Cross-Origin Resource Sharing, CORS관련 헤더
      • Access-Control-Allow-Origin: * (모든 오리진 허용)
    • Strict-Transport-Security : HTTPS를 통해서만 접속해야함을 알림.
      • Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
  3. 엔터티 헤더 (Entity Headers, 응답 본문에 대한 정보):
    • Content-Type: 응답 본문의 콘텐츠 타입
      • Content-Type: text/html; charset=utf-8 (UTF-8 인코딩된 HTML)
    • Content-Length: 응답 본문의 길이
    • Content-Encoding: 응답 본문의 압축 방식
    • Last-Modified: 리소스가 마지막으로 수정된 날짜와 시간
      • Last-Modified: Mon, 22 Apr 2024 10:00:00 GMT
    • ETag: 리소스의 특정 버전을 식별하는 태그 (캐시 유효성 검사에 사용)
      • ETag: "60d7894b-1a4f"

헤더 사용 시 주의 사항

  • 대소문자 구분 없음 (Case-insensitive): HTTP 헤더 이름은 대소문자를 구분하지 않는다. (예: Content-Type과 content-type은 동일)
  • 커스텀 헤더: 표준 헤더 외에 X- 접두사를 사용하여 커스텀 헤더를 정의할 수 있다. (예: X-My-Custom-Header)
  • 보안: 민감한 정보(비밀번호, API 키 등)는 헤더에 직접 포함하지 않고, 적절한 보안 메커니즘(HTTPS, 인증 토큰 등)을 사용해야 한다.

HTTPS (Hypertext Transfer Protocol Secure)

  • HTTP에 보안 기능을 추가한 프로토콜.
  • SSL/TLS 암호화를 사용하여 클라이언트와 서버 간의 통신을 보호.
  • 데이터 유출, 변조, 도청 등을 방지하여 안전한 웹 통신을 제공.
  • 웹 브라우저 주소창에 자물쇠 아이콘과 함께 "https://"로 시작하는 URL로 표시.

 

 

저작자표시 비영리 변경금지 (새창열림)

'개발 > HTTP' 카테고리의 다른 글

쿠키(Cookie)와 세션(Session)  (0) 2025.03.13
'개발/HTTP' 카테고리의 다른 글
  • 쿠키(Cookie)와 세션(Session)
함수형 인간
함수형 인간
잘 까먹는 개발자의 두뇌 확장 장치
  • 함수형 인간
    개발 기록 노트
    함수형 인간
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 글 목록 (84)
      • 기타 (1)
      • 개발 (82)
        • Java (6)
        • Javascript (1)
        • Spring (20)
        • jQuery (0)
        • Git (0)
        • servlet (11)
        • JSP (6)
        • HTML (0)
        • CSS (10)
        • SQL (9)
        • JSTL (3)
        • Mybatis (4)
        • Design Patterns (0)
        • HTTP (2)
        • Devtools (0)
        • IntelliJ (5)
        • JDBC (1)
        • Lombok (3)
        • Logging (1)
      • 책 리뷰 (0)
  • hELLO· Designed By정상우.v4.10.3
함수형 인간
HTTP
상단으로

티스토리툴바