• [인프런 김영한 로드맵3]모든 개발자를 위한 HTTP 웹 기본 지식1

    2022. 8. 22.

    by. 웰시코더

    반응형

    - 김영한님의 인프런강의 '모든 개발자를 위한 HTTP 웹 기본 지식'을 학습하고 정리한 내용이다.

    - HTTP 웹 기본 지식과 관련된 내용을 학습힌다.

    - 모든 내용 및 이미지 출처는 인프런 및 김영한님에게 있습니다.


    1.인터넷 네트워크

     

    • 인터넷에서 클라이언트와 서버는 서로 통신 함
    • 보내는 쪽(클라이언트)은 서버 정보를 알아야 보낼 수 있음 -> IP
    • IP를 통해 데이터 전달
    • 패킷이라는 통신단위로 데이터 전달
    • IP패킷에는 출발지IP, 도착지IP, 기타정보로 구성
    • 클라이언트가 도착지IP에 패킷 전달하면 서버는 출발지IP를 확인 후 OK 응답 등을 보냄
    • IP 프로토콜의 한계
      • 1)비연결성 : 패킷 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송
      • 2)비신뢰성 : 중간에 패킷이 사라지거나 패킷 순서가 변경되는 경우 발생
      • 3)프로그램 구분 : 서버에 애플리케이션이 2개 이상이면?
    • IP 프로토콜 한계를 극복하기 위한 TCP 탄생
    • 우선 인터넷 프로토콜 스택 4계층을 알아야 함(하단 이미지 참고)
      • cf)네트워크 전송시 데이터 표준을 정리한 것이 OSI 7계층, 이 이론을 실제 사용하는 인터넷표준이 TCP/IP 4계층

     

    이미지출처 : 김영한님 강의 자료

     

    • IP한계를 극복한 TCP/IP모델의 통신 순서
      • 1)프로그램이 Hello, world! 메시지 생성(애플리케이션 계층)
      • 2)SOCKET 라이브러리를 통해 전달(애플리케이션계층)
      • 3)TCP정보 생성, 메시지 데이터 포함(전송계층)
      • 4)IP패킷생성, TCP데이터 포함(인터넷계층)
      • 5)LAN카드를 통해 서버로 전달(네트워크 인터페이스 계층)
    • TCP/IP패킷정보의 TCP 부분에 출발지PORT, 목적지PORT, 전송제어, 순서, 검증정보 등 존재
    • TCP 특징
      • 1)연결지향 : 3 way handshake
        • SYN : 접속 요청
        • ACK : 요청 수락(ACK와 함께 데이터 전송 가능)
      • 2)데이터 전달 보증
      • 3)순서 보장
        • 패킷1,패킷2,패킷3순서로 전송했는데 서버가 패킷1,패킷3,패킷2로 받으면?
          • 서버에서 패킷2부터 재전송 요청을 클라이언트에게 응답
    • UDP라는 것도 있음. UDP 특징
      • 하얀 도화지에 비유(기능 거의 없음)
      • 연결지향X,데이터전달보증X, 순서보장X
      • but, 단순하고 빠름
      • IP와 거의 같지만 PORT, 체크섬 정도 추가
      • 애플리케이션 추가 작업 필요
    • PORT
      • PORT는 같은 IP내에서 프로세스 구분(프로세스는 실행되는 프로그램)
    • DNS
      • IP는 기억하기 어려움 + 변경 가능성
      • 전화번호부같은 시스템 필요
      • 도메인명을 IP주소로 변환해주는 시스템
      • google.com 요청시 DNS서버에서 IP(200.200.200.2)를 알려주면 이 IP를 통해 서버 접근

     

     

    2.URI와 웹 브라우저 요청 흐름

     

    1)URI

    • URI, URL, URN
      • URI : Uniform Resource Identifier
      • URL : Uniform Resource Locator
      • URN : Uniform Resource Name
    • URI가 가장 큰 개념
    • URI뜻
      • Uniform : 리소스를 식별하는 통일된 방식
      • Resource : 자원, URI로 식별할 수 있는 모든 것(제한 없음)
      • Identifier : 다른 항목과 구분하는데 필요한 정보
    • URN 이름만으로 실제 리소스 찾기 보편화되지 않음
    • URL, URI 같은 의미로 많이 사용
    • URL 분석
      • https://www.google.com/search?q=hello&hl=ko
      • scheme://[userinfo@]host[:port][/path][?query][#fragment]
      • scheme
        • 주로 프로토콜을 사용. 프로토콜은 어떤 방식으로 자원에 접근할 것인가 하는 약속 규칙
        • http, https, ftp 등
        • http는 80, https는 443 기본 포트(생략가능)
        • http + secure = https
      • userinfo
        • URL에 사용자정보 포함해서 인증
        • 거의사용X
      • host
        • 호스트명
        • 도메인명 또는 IP주소를 직접 사용가능
      • port
        • 접속 포트
      • path
        • 리소스 경로. 계층적 구조
      • query
        • key=value형태
        • ?로 시작. &로 추가 가능 ex)keyA=valueA&keyB=valueB
        • 쿼리파라미터, 쿼리스트링으로 불림
      • fragment
        • html 내부 북마크 등에 사용(서버에 전송하는 정보 X)

     

     

     

    2)웹 브라우저 요청 흐름

     

    https://www.google.com/search?q=hello&hl=ko 요청을 보내려고한다. 요청시 웹 브라우저가 HTTP 메시지를 다음과 같이 생성한다.

     

     

    SOCKET 라이브러리를 통해 전달한다. TCP/IP로 연결되어 패킷생성 및 HTTP메시지를 다음과 같이 포함한다. 

     

     

    네트워크인터페이스(물리계층)를 통해 서버로 전달된다. 서버는 다음과 같은 응답메시지를 보낸다.

     

     

     

    3.HTTP

     

    1)모든 것이 HTTP

    • HTTP 메시지에 모든 것을 전송
    • HTML, TEXT, IMAGE, 음성, 영상, 파일..
    • JSON, XML(API)
    • 거의 모든 형태의 데이터 전송 가능
    • 서버간에 데이터 주고받을 때도 대부분 HTTP를 사용
    • HTTP역사
      • HTTP/0.9부터 HTTP/3까지 진행중..
      • HTTP/1.1을 가장 많이 사용
    • 기반 프로토콜
      • TCP:HTTP/1.1, HTTP/2
      • UDP : HTTP/3
      • 현재 HTTP/1.1 주로 사용(HTTP/2, HTTP/3도 점점 증가)
    • HTTP 특징
      • 클라이언트 서버 구조
      • 무상태 프로토콜(stateless), 비연결성
      • HTTP 메시지
      • 단순함, 확장가능

     

    2)클라이언트 서버 구조

    • Request, Response 구조
    • 클라이언트가 서버에 요청, 서버가 클라이언트에 응답

     

    3)Stateful, Stateless

    • 상태 프로토콜(stateless)
      • 서버가 클라이언트 상태를 보존하지 않음
      • 장점 : 서버 확장성 높음(scale out)
      • 단점 : 클라이언트 추가 데이터 전송 필요
    • stateful, stateless 차이 예시
      • stateful
        • 노트북 구매시 점원이 중간에 바뀌면 고객 말을 못알아 듣는다.
        • 항상 같은 서버가 유지되어야함. 서버1에 요청을 보내면 서버1에만 연결 유지되어야 함
        • 중간에 서버1장애나면 응답 오류..
      • stateless
        • 중간에 다른 점원으로 바뀌어도 됨. (응답서버를 쉽게 바꿀 수 있음)
        • 아무서버나 호출해도 됨. 서버1에 요청보내다가 서버1장애발생시 서버2로 요청 전환
      • 실무한계
        • 로그인 필요없는 서비스 소개 화면 등은 무상태로 설계 가능
        • 로그인 필요한 곳은 상태유지 필요 -> 로그인한 상태를 서버에 유지해야함.
          • 브라우저 쿠키, 서버 세션등을 사용하여 유지
          • 상태 유지는 최소한만 사용

     

    4)비연결성(connectionless)

     

    • 연결 유지 모델은 클라이언트 요청시 TCP/IP 연결을 하면 종료되도 끊지 않아서 자원 소모
    • 연결 비유지 모델은 클라이언트 요청시 서버와 TCP/IP로 연결되지만, 응답이 종료되면 TCP/IP 연결을 종료해서 최소한의 자원 유지
    • HTTP는 기본이 연결을 유지하지 않는 모델 → 서버자원을 효율적으로 사용 가능
    • 한계
      • TCP/IP연결시 3way handshake 시간 추가
      • 웹브라우저로 사이트 요청시 HTML, JS, CSS 등 많은 자원이 다운로드
      • HTTP 지속연결로 문제 해결(아래 이미지 참고)
      • HTTP/2, HTTP/3에서 최적화

     

     

     

    5)HTTP 메시지

     

    HTTP 메시지는 다음과 같이 구성되어 있다.

     

     

     

    • 1)start-line : 요청시 request-line, 응답시 status-line
    • 2)http header : http 전송에 필요한 모든 부가정보. 메시지바디 내용, 크기, 압축, 인증 등..
    • 3)http message body : 실제 전송할 데이터. HTML문서, 이미지, 영상, JSON등 byte로 표현가능한 모든 데이터 전송 가능

     

    4.HTTP 메서드

     

    1)HTTP API를 만들어보자

     

    다음과 같이 회원정보관리 API를 만든다고 가정한다.

    • 회원목록조회 /read-member-list
    • 회원조회 /read-member-by-id
    • 회원등록 /create-member
    • 회원수정 /update-member
    • 회원삭제 /delete-member

     

    좋은 URI 설계에서 중요한 것은 리소스 식별이다. 리소스는 등록, 수정 등의 '행위'가 아니라 회원이라는 개념 자체가 리소스이다. 회원이라는 리소스만 식별하고 등록, 조회 등 모두 배제한다.

     

    리소스를 식별하여 URI계층구조를 활용하면 다음과 같이 만들 수 있다.(참고로 계층구조상 상위를 컬렉션으로 보고 복수단어(members) 사용을 권장한다.)

     

    • 회원목록조회 /members
    • 회원조회 /members/{id}
    • 회원등록 /members/{id}
    • 회원수정 /members/{id}
    • 회원삭제 /members/{id}

     

    행위(메서드)인 조회, 등록, 수정 등 어떻게 구분할까? 

     

    2)HTTP 메서드 - GET, POST

     

    HTTP 메서드 종류는 다음과 같다.

    • GET : 리소스 조회
    • POST : 요청 데이터 처리. 주로 등록에 사용
    • PUT : 리소스를 대체. 해당 리소스 없으면 생성
    • PATCH : 리소스 부분 변경
    • DELETE : 리소스 삭제

     

    기타 다음과 같은 메서드도 있다.

    • HEAD, OPTIONS, CONNECT, TRACE..

     

    GET메서드는 다음과 같은 특징을 가진다.

    • 리소스 조회
    • 서버에 전달하고 싶은 데이터는 query(쿼리파라미터, 쿼리스트링)로 전달
    • 메시지 바디를 사용하여 전달 가능하지만 지원하지않는 곳이 많아 권장 안 함

     

    POST메서드는 다음과 같은 특징을 가진다.

    • 요청 데이터 처리
    • 메시지 바디를 통해 서버로 요청 데이터 전달
    • 서버는 요청 데이터 처리
    • 신규 리소스 등록, 프로세스 처리 등에 사용
    • JSON으로 조회 데이터 넘겨야 하는데 GET 메서드 사용이 어려운경우 POST 사용하기도 함

     

    3)HTTP 메서드 - PUT, PATCH, DELETE

     

    PUT은 다음과 같은 특징을 가진다.

    • 리소스를 대체(리소스가 있으면 대체, 없으면  생성)
    • 리소스를 덮어버린단 의미
    • POST와의 차이점 → 클라이언트가 리소스 위치를 알고 URI 지정

    PATCH와의 차이점은?

    • PUT은 완전변경 / PATCH는 부분변경
    • members/100 데이터가 {"username" : "young", "age": 20}이라고 가정할 떄..
      • PUT으로 {"age":50}을 보내면 members/100데이터는 {"age":50}으로 덮힘
      • PATCH로 {"age":50}을 보내면 members/100데이터는 {"username": "young", "age":50}으로 변경

     

    DELETE는 리소스를 제거한다. 

     

     

    4)HTTP 메서드의 속성

    • 안전(Safe Methods)
      • 호출해도 리소스 변경 안 함
      • 안전메서드 : GET, HEAD
    • 멱등(Idempotent Methods)
      • f(f(x)) = f(x)
      • 한 번 호출하든 두 번 호출하든 100번 호출하든 결과 같음
      • 멱등메서드 : GET, PUT, DELETE
      • POST는 멱등이 아님. 두 번 호출시 같은 결제가 중복해서 발생할 수 있음
      • 자동복구메커니즘 등에 활용가능 → 서버가 TIMEOUT 등으로 정상응답 못줬을 때 클라이언트가 같은 요청을 해도 되는지에 대한 판단 근거
      • 멱등은 외부요인으로 중간에 리소스 변경되는 것까지 고려X
    • 캐시가능(Cacheable Methods)
      • 응답 결과 리소스를 캐시해서 사용해도 되는가?
      • GET, HEAD, POST, PATCH 캐시 가능
      • 실제로는 GET, HEAD 정도만 캐시로 사용

     

     

    5.HTTP 메서드 활용

     

    1)클라이언트에서 서버로 데이터 전송

     

    데이터 전달방식은 크게 2가지가 있다.

    • 1)쿼리파라미터 : GET 전송. 주로 정렬필터(검색)
    • 2)메시지바디 : POST, PUT, PATCH 전송. 회원가입, 상품주문, 리소스 등록 등

     

    데이터 전송의 4가지 상황이 있다.

    • 1)정적데이터 조회 : 이미지, 정적텍스트 문서
    • 2)동적데이터 조회 : 검색, 게시판 목록에서 정렬필터
    • 3)HTTP Form을 통한 데이터 전송 : 회원가입, 상품주문, 데이터 변경
    • 4)HTTP API를 통한 데이터 전송 : 회원가입, 상품주문, 데이터 변경(서버to서버, 앱클라이언트, 웹클라이언트Ajax)

    1)과 2)는 쿼리파라미터 방식이고 3)과 4)는 메시지바디에 담는 전달방식으로 생각하자.

     

    GET전송은 조회에서만 사용하며 등록시에는 사용하면 안 된다.

     

    파일 업로드인 경우 multipart/form-data 인코딩 타입으로 POST요청한다.

    • Content-type : multipart/form-data
    • 파일업로드같은 바이너리 데이터 전송시 사용
    • 다른 종류의 여러 파일과 폼의 내용 함께 전송가능(이름이 multipart)
    • HTML Form전송은 GET, POST만 지원

     

    2)HTTP API 설계 예시

     

    HTTP API 데이터 전송시 POST 등록시와 PUT 등록시 컬렉션과 스토어라는 개념이 나온다.

    • 컬렉션
      • POST로 신규자원 등록시..
      • 클라이언트는 등록될 리소스 URI를 모른다. 서버가 새로 등록된 리소스 URI를 생성해준다.
      • ex) /members/100
      • 컬렉션은 서버가 관리하는 리소스 디렉토리이며 여기서 컬렉션은 /members
    • 스토어
      • PUT으로 신규자원 등록시..
      • 클라이언트가 리소스 URI를 알고 있어야 한다.
      • ex) files/star.jpg
      • 클라이언트가 직접 리소스 URI를 지정
      • 클라이언트가 관리하는 리소스 저장소. 여기서 스토어는 /files

     

     

    HTTP Form 전송과 HTTP API 전송의 차이점은 다음과 같다.

    • HTTP Form 전송은 응답결과로 HTML을 받는다.
    • HTTP API 전송은 응답결과로 데이터를 받는다.

     

     

     

     

     

    참고
    https://velog.io/@jehjong/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%9D%B8%ED%84%B0%EB%B7%B0-TCPIP-4%EA%B3%84%EC%B8%B5

    https://hseungyeon.tistory.com/437?category=1060297

    반응형

    댓글