CS/Network

[Network] 웹의 동작 원리 + HTTP & HTTPS

Uykm 2023. 7. 26. 20:52

▼ Why ? What ?

HTTP는 서버와 클라이언트가 데이터를 주고 받기 위한 프로토콜(protocol)이기 때문에, 웹이 동작하는 과정을 이해하려면 웹 개발을 하기 위해서 알아야 하는 가장 중요한 개념들 중 하나이다. 그래서 이번 웹 개발 프로젝트를 진행하기 위해선 HTTP에 대해 이해하는 것이 시급하다고 생각하여 HTTP와 HTTPS에 대해 공부하게 되었다.


▼ 웹의 동작 원리

 

웹이 어떻게 동작하는가 ?

  • 웹 브라우저를 통해 찾고자 하는 웹 페이지의 URL 주소를 입력하고, 원하는 데이터를 받는다

    1. 우리가 URL 주소를 입력하면, 사용자가 입력한 URL 주소 중에 Domain Name 부분을 DNS(Domain Name Server)에서 검사한다
      [ IP 주소를 기억하기 쉽게 표현한 것 ➜ Domain Name (google.com, naver.com, etc) ]

    2. DNS에서 해당 Domain 주소에 해당하는 IP 주소를 찾았으면, IP 주소와 사용자가 입력한 URL 정보를 함께 전달한다

    3. 이때 HTTP 프로토콜을 사용하여 HTTP Request 메시지를 생성한다

    4. 이렇게 생성된 HTTP Request 메시지는 TCP 프로토콜을 사용해 인터넷을 거쳐 해당 IP 주소의 컴퓨터로 이동한다

    5. 이렇게 도착한 HTTP Request 메시지는 HTTP 프로토콜을 사용해 다시 웹 페이지 URL 정보로 변환된다

    6. 웹 서버는 도착한 웹 페이지 URL 정보에 해당하는 데이터를 검색

    7. 이렇게 검색된 웹 페이지 데이터는 또다시 HTTP 프로토콜을 사용해 HTTP Response 메시지를 생성한다

    8. 이렇게 생성된 HTTP Response 메시지는 TCP 프로토콜을 사용해 인터넷을 거쳐 원래의 컴퓨터로 다시 전송된다

    9. 도착한 HTTP Response 메시지는 HTTP 프로토콜을 사용해 웹 페이지 데이터로 변환되고, 변환된 웹 페이지 데이터는 웹 브라우저에 의해 출력되어 우리가 볼 수 있게 되는 것이다

 

URL

Scheme = Protocol

  • Uniform Resource Locator
    ➜ 웹(web) 상에서 자원(Resource)들의 위치

  • 특정 웹 서버의 특정 파일에 접근하기 위한 경로(주소)

  • Domain(IP 주소) 웹 서버의 위치

  • Port   웹 서버에서 자원에 접근하기 위해 사용하는 게이트 번호 (웹 브라우저에서 자동 처리)
    (기본 Port 값) http 80  /  https 443

 


  HTTP (Hyper-Text Transfer Protocol)

 

HTTP ?

  • Server/Client 모델을 따르는 인터넷 상에서 데이터를 주고받기 위한 Protocol을 의미 !
    ➜ HTML 문서, 이미지, 동영상, 텍스트 등 어떤 종류의 데이터도 전송할 수 있도록 설계되어 있다

  • (Request) 클라이언트 ➜ 서버 
    (Response) 서버 ➜ 클라이언트

 


 

HTTPS (Hypertext Transfer Protocol Secure) ?

  • 하이퍼 텍스트 전송 프로토콜 보안으로 표준 HTTP와 동일한 방식으로 작동한다

  • 서버와 주고받는 데이터가 암호화되기 때문에 웹사이트에 추가적인 보호를 제공한다

     개인 데이터를 훔치거나, 해킹하거나 볼 수 없도록 작동 !

 


 

무상태(Stateless) 프로토콜

 

  • 서버가 클라이언트의 상태를 보존 X
    ➜ 매 요청(Request)에 대해 첫 응답(Response)인 것처럼 작동

  • 쿠키(Cookie), 세션(Session), 토큰(Token) 같은 기능이 구현되지 않은 사이트에 로그인 했을 때, 예를 들어 메일 서비스로 이동했을 때 로그인 상태가 유지되지 않아 로그인을 재요청할 것이다
    ➜ 요청할 때마다 이전에 보냈던 데이터를 함께 보내줘야 하는 단점 때문에 쿠키세션, 토큰 같은 기능들이 생겨난 것이다

  • 장점
    스케일 아웃(scale-out)에 유리
    [ Scale-out : 서버를 수평적으로 늘려 서버의 부하를 줄이는 방법 ( + 로드 밸런싱(load balancing) ) ]
    ➜ 클라이언트의 상태를 보존하지 않기 때문에 어떤 서버에서도 클라이언트의 요청동일하게 처리하기 때문이다 !

 

비연결성

 

  • HTTP 통신은 요청이 있을 때만 연결을 유지하고, 이후 데이터를 전송하면 연결을 종료한다

  • 데이터 전송이 필요한 때만 연결이 유지되기 때문에, 불특정 다수를 대상으로 하는 서비스에 적합하다
    ➜ 실제 사용자가 수천명이라도 서버에서 동시에 처리하는 요청 수는 수십개 이하로 작아지기 때문에 !
    ➜ 서버의 자원을 효율적으로 사용 가능

  • 비연결성의 단점 극복

    1. Persistent connection
      한 번의 연결로 여러 데이터를 보낼 수 있게 됐다

    2.  Pipelining
        요청을 연속적으로 보내서 순차적으로 받아 데이터 요청/응답에 대한 지연시간이 감소했다

 


  HTTP 메시지 구조

 

 

요청(Request) 데이터 포맷 (구조)

 

헤더 부분 (Header)

 

  • START-LINE (첫줄)
    - Request(요청)인지 Response(응답)인지에 따라 다른 정보를 포함하게 된다
    요청 메서드, 요청 URL, HTTP 프로토콜의 버전

method (공백 - SP) request-target (공백 - SP) HTTP-version (엔터 - CRLF)

 

  • 요청 메서드 (Request Method)

    • GET : 리소스를 조회할 때 주로 사용.
    • POST : 요청 데이터 처리, 주로 등록에 사용
    • PUT : 리소스를 대체 할 때 주로 사용, 해당 리소스가 없으면 생성함.
    • PATCH : 리소스 부분을 일부 변경해야할 때 주로 사용. 
    • DELETE : 리소스 삭제
    • HEAD : (HTTP)헤더 정보만 요청한다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는 지를 확인하기 위해서 사용한다.
    • OPTIONS : 웹서버가 지웒나느 메서드의 종류를 요청한다.
    • TRACE : 클라이언트의 요청을 그대로 반환한다. 예컨데 echo서비스로 서버상태를 확인한기 위한 목적으로 주로 사용한다.

      ➜ 주의할 점
      : HTTP 메서드에 따라 서버에서 동작을 지정해줘야 한다! 메서드에 따른 동작은 모두 서버에서 구현해주어야하는 부분이다
      ( GET 메서드로 요청했다고 해서 무조건 데이터를 조회하는 것이 아니고, DELETE 메서드로 요청했다고 해서 무조건 해당 데이터를 삭제하는 것 X )

  • 요청 URL : 요청하는 리소스(자원)의 위치를 명시
    request-target 
    : /member?name=John 이 이에 해당하는 부분이며, /member라는 리소스에 name=John이라는 파라미터를 지정하여 데이터를 보내는 것이다. 서버에서는 "/member"으로 왔을때 처리하는 로직들을 실행한다. 요청 객체(HttpRequest)에서 request.getParameter("name")을 하여 John이라는 값을 가져올 수 있다.

  • HTTP 프로토콜의 버전 : 웹 브라우저가 사용하는 http 프로토콜의 버전

  • 나머지 헤더 부분은 여러 줄의 헤더 정보. 각각의 줄은 헤더명과 헤더 값이 콜론으로 구분

 


 

Empty Line

 

  • 헤더(Header)와 바디(Message Body)를 구분하기 위한 것으로, 헤더와 바디 사이의 한 줄의 공백을 말한다

 


 

요청 바디 (Request Body; Message Body)

 

  • 요청을 할 때 함께 보낼 데이터가 담길 부분이다

  • 요청 메서드(Request Method)가 POSTPUT을 사용하게 됐을 때 필요 !
    ( GET 메서드 방식은 요청을 할 때 함께 보내야 하는 리소스도 URL에 붙여주기 때문에 요청 바디가 필요 X )

 


 

응답(Response) 데이터 포맷

 

헤더 부분 (Header)

 

  • START-LINE (첫 줄) 응답 HTTP 프로토콜의 버전, 상태 코드(status-code), 응답 메시지
    ( 성공했다는 응답 코드는 200 )

HTTP-version (공백 - SP) status-code (공백 - SP) reason-pharse (엔터 - CRLF)

 

  • status-code : HTTP 요청에 대한 서버의 응답 상태
    ➜ 웹 서핑을 하다 보면 많이 볼 수 있는  404 에러 페이지가 이에 해당한다
    • 2xx : 성공
    • 4xx : 클라이언트 요청 오류
    • 5xx : 서버 내부 오류

 

  • reason-phrase : 사람이 이해할 수 있는 짧은 상태 코드 설명 글

 

  • 나머지 헤더 부분엔 날짜, 웹서버 이름과 버전, 콘텐츠 타입, 캐시 제어 방식, 콘텐츠 길이 등의 값이 들어간다

 


 

응답 바디 (Response Body)

 

  • 실제 응답 리소스 데이터가 담긴 부분으로, HTML 문서나 이미지, 영상, 음성, JSON 등등 byte로 표현할 수 있는 모든 데이터를 전송 가능하다
    ( 응답 메시지에 HTML이 담겨 있는데 이 HTML을 받아 브라우저가 화면에 렌더링해준다 )