[Network] HTTP, HTTPS

mingsso·2023년 11월 15일
0

CS

목록 보기
4/30
post-thumbnail
post-custom-banner

1️⃣ HTTP(HyperText Transfer Protocol)란

HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜

  • 웹에서 이루어지는 모든 데이터 교환의 기초임
  • HTML, TEXT / 이미지, 음성, 영상, 파일 / JSON, XML → 거의 모든 형태의 데이터 전송 가능
  • 서버 간에 데이터를 주고 받을 때도 대부분 HTTP를 사용함

HTTP의 역사

  • HTTP/0.9 (1991년) - GET 메소드만 지원, HTTP 헤더 X
  • HTTP/1.0 (1996년) - 메소드, 헤더 추가
  • HTTP/1.1 (1997년) - 가장 많이 사용, HTTP 대부분의 기능이 담겨 있음
  • HTTP/2 (2015년) - 성능 개선
  • HTTP/3 (진행중) - TCP 대신에 UDP 사용(QUIC=Quick UDP 사용), 성능 개선

HTTP의 특징

  • 단순한 프로토콜 → 쉽게 확장 가능
  • 클라이언트-서버 구조
    • Request-Response 구조
    • 클라이언트는 서버에 요청을 보내고, 응답을 대기함
    • 서버가 요청에 대한 결과를 만들어서 응답함
  • 무상태 프로토콜(Stateless), 비연결성
    • 서버가 클라이언트의 상태를 보존하지 않음
    • 장점: 서버 확장성 높음(스케일 아웃) → 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있음, 서버 자원 효율적으로 사용 가능
    • 단점: 클라이언트가 추가 데이터를 전송하기 힘듦
    • → 웹 애플리케이션을 설계할 때는 최대한 Stateless로 설계하고 필요한 경우(로그인 등)에만 Stateful로 설계해야 함
    고객: 이 노트북 얼마인가요?
    점원: 100만원 입니다

    고객: 2개 구매하겠습니다
    점원: ? 무엇을 2개 구매하시겠어요?

    고객: 신용카드로 구매하겠습니다
    점원: ? 무슨 제품을 몇 개 신용카드로 구매하시겠어요?

  • HTTP 메시지
    1. 시작 라인
      • 요청) HTTP 메소드(GET) + 요청 대상(/search?q=hello&hl=ko) + HTTP 버전
      • 응답) HTTP 버전 + 상태 코드 + 이유 문구
      • 상태 코드: 200(성공), 400(클라이언트 요청 오류), 500(서버 내부 오류) → 아래에 자세히 기술
    2. HTTP 헤더 - HTTP 전송에 필요한 모든 부가 정보
    3. HTTP 메시지 바디 - 실제 전송할 데이터



2️⃣ HTTP 메소드 종류

GET

리소스 조회

  • 서버에 전달하고 싶은 데이터는 query(쿼리 파라미터, 쿼리 스트링)을 통해서 전달
  • 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않음


POST

요청 데이터 처리, 주로 등록에 사용

  • 메시지 바디를 통해 서버로 요청 데이터 전달
  • 서버는 요청 데이터를 처리
  • 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용


PUT

리소스를 대체, 해당 리소스가 없으면 생성 → 즉 덮어버림

PATCH

리소스 부분 변경 → PATCH가 지원 안되는 서버의 경우 POST를 쓰면 됨

DELETE

리소스 삭제


GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환

OPTIONS

대상 리소스에 대한 통신 가능 옵션을 설명 (주로 CORS에서 사용)

CONNECT

대상 리소스로 식별되는 서버에 대한 터널을 설정

TRACE

대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행


HTTP 메소드의 속성

  • 안전
    • 호출해도 리소스를 변경하지 않음
  • 멱등
    • 한 번 호출하든 100번 호출하든 결과가 똑같음, f(f(x)) = f(x)
    • ⭕GET - 한 번 조회하든, 두 번 조회하든 결과가 똑같음 (외부 요인에 의한 리소스 변경은 고려하지 않음)
    • ⭕PUT - 결과를 대체함 → 같은 요청을 여러 번 해도 최종 결과는 같음
    • ⭕DELETE - 결과를 삭제함 → 같은 요청을 여러 번 해도 삭제된 결과는 똑같음
    • ❌POST - 멱등이 아님! 쇼핑몰 결제 시 두 번 호출하면 같은 결제가 중복해서 발생할 수 있음
  • 캐시 가능
    • 응답 결과 리소스를 캐시해서 사용해도 되는지
    • GET, HEAD, POST, PATCH 캐시 가능 → 실제로는 GET, HEAD 정도만 캐시로 사용
    • POST, PATCH는 본문 내용까지 캐시 키로 고려해야 하는데, 구현이 쉽지 않음



3️⃣ (실무에서 사용되는) HTTP 상태 코드

클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능

1xx (Informational)

요청이 수신되어 처리 중 → 거의 사용되지 않음

2xx (Successful)

요청 정상 처리

  • 200 OK
  • 201 Created: 요청이 성공해서 새로운 리소스가 생성됨
  • 202 Accepted: 요청이 접수되었으나 처리가 완료되지 않았음(배치 처리 등에서 사용)
  • 204 No Content: 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음 (save 버튼의 결과로 아무 내용도 없어도 됨)

3xx (Redirection)

요청을 완료하기 위해 유저 에이전트의 추가 조치가 필요함

  • 영구 리다이렉션: 301, 308
    • 리소스의 URI가 영구적으로 이동되었을 경우
    • 301 Moved Permanently: 리다이렉트 시 요청 메소드가 GET으로 변하고, 본문이 제거될 수 있음 (실무에서는 홈피를 업뎃하면 전달해야 하는 내용도 바뀌는 경우가 많기 때문)
    • 308 Permanent Redirect: 리다이렉트 시 요청 메소드와 본문 유지
  • 일시적인 리다이렉션: 302, 307, 303
    • 리소스의 URI가 일시적으로 변경되었을 경우
    • ex) POST로 주문 후에 주문 결과 화면을 GET 메소드로 리턴 → 중복 주문 방지
    • 302 Found: 리다이렉트 시 요청 메소드가 GET으로 변하고, 본문이 제거될 수 있음
    • 307 Temporary Redirect: 리다이렉트 시 요청 메소드와 본문 유지
    • 303 See Other: 리다이렉트 시 요청 메소드가 GET으로 변경
  • 기타 리다이렉션: 300, 304
    • 300 Multiple Choices: 안씀
    • 304 Not Modified: 캐시를 목적으로 사용(클라이언트에게 리소스가 수정되지 않았음을 알려주며 캐시로 리다이렉트함)

4xx (Client Error)

클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음

  • 401 Unauthorized: 클라이언트가 해당 리소스에 대한 인증이 필요함
  • 403 Forbidden: 서버가 요청을 이해했지만 승인을 거부함(관리자 권한 페이지에 접근 등)
  • 404 Not Found: 요청 리소스를 찾을 수 없음

5xx (Server Error)

서버 오류, 서버가 정상 요청을 처리하지 못함

  • 503 Service Unavailable: 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음



4️⃣ HTTP Header 구조

일반 헤더 (General Header)

Date: Wed, 21 Oct 2015 07:28:00 GMT 
Connection: keep-alive
Cache-Control: max-age=0
  • Date: 메시지를 생성한 일시
  • Connection: 현재의 전송이 완료된 후에도 네트워크 접속을 유지할지
    • keep-alibe: 지속 연결
    • close: 연결 종료
  • Cahce-control: 캐싱 허용 설정

요청 헤더 (Request Header)

Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  • Host: 요청자의 호스트명, 포트번호
  • User-Agent: 요청자의 소프트웨어 정보 (OS, 브라우저, 기타 버전 정보)
  • Accept: 요청자가 원하는 미디어의 타입 및 우선순위

응답 헤더 (Response Header)

Server: Apache/2.4.41 (Unix)
Content-Type: text/html
Set-Cookie: user_id=123; Expires=Fri, 19 Nov 2023 12:00:00 GMT; Path=/
  • Server: 서버의 소프트웨어 정보
  • Content-Type: 응답하는 내용의 타입과 문자 포맷
  • Set-Cookie: 서버에서 클라이언트에게 쿠키 설정 지시함

엔티티 헤더 (Entity Header)

Content-Length: 12345
Content-Encoding: gzip
Content-Language: en-US
  • Content-Length: 본문의 길이
  • Content-Encoding: 응답 내용의 인코딩 포맷
  • Content-Language: 응답 내용의 언어


이외에도 수많은 속성과 내용이 있다



5️⃣ HTTPS

  • HTTPS는 HTTP와 별개의 프로토콜이 아닌 HTTP의 확장임
  • HTTPS는 인터넷에서 보안 통신을 위해 사용됨 <- HTTP에는 데이터를 암호화하는 과정이 없기 때문에, 서버와 브라우저의 통신 과정에서 데이터가 그대로 노출될 위험이 큼
  • TLS 또는 SSL을 사용해 암호화함 (SSL Handshake)
  • 네이버, 다음, 구글은 검색 엔진 최적화(SEO) 관련 내용을 HTTPS 웹사이트에 대해서 적용하고 있음. 즉, HTTPS화를 하고 있다면 키워드 검색 시 상위에 노출됨




모든 사이트에서 텍스트를 암호화해서 주고 받으면 과부하가 걸려 속도가 느려질 수 있음
-> 중요한 사이트는 HTTPS로 관리하고, 그렇지 않은 사이트는 HTTP를 사용함






참고자료

모든 개발자를 위한 HTTP 웹 기본 지식_김영한
https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/
https://rachel-kwak.github.io/2021/03/08/HTTPS.html
https://wonit.tistory.com/309?category=749910
https://velog.io/@jkijki12/HTTP-Header-정리#request-header

profile
🐥👩‍💻💰
post-custom-banner

0개의 댓글