ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • HTTP 웹 기본 지식 - 2. HTTP & HTTP메서드
    Web/모든 개발자를 위한 HTTP 웹 기본 지식 2022. 5. 25. 13:29

    HTTP ( HyperText Transfer Protocol )

    - HTTP 메세지에 모든 것을 전송

        ㆍ HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, XML (API), 거의 모든 형태의 전송가능

        ㆍ 서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용

    - 기반 프로토콜

        ㆍTCP : HTTP/1.1, HTTP/2     ㆍUDP : HTTP/3    ㆍ현재 HTTP/1.1 주로 사용

     

    HTTP 특징

    - 클라이언트 서버 구조

    - 무상태 프로토콜(stateless), 비연결성

    - HTTP 메세지

    - 단순함, 확장 가능

     

    ① 클라이언트 서버 구조

    - Request Response 구조

    - 클라이언트는 서버에 요청을 보내고, 응답을 대기

    - 서버가 요청에 대한 결과를 만들어서 응답

    - 클라이언트는 UX/UI, 서버는 데이터,비즈니스로직에 집중하여 독립적으로 진화가능!

     

    ② 무상태 프로토콜 ( Stateless )

    - 서버가 클라이언트의 상태를 보존 X

    - 장점 : 서버 확장성이 높음 ( 스케일 아웃 - 수평확장유리 )

    - 단점 : 클라이언트가 추가 데이터 전송

     

    - 무상태면 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다

    - 무상태는 응답 서버를 쉽게 바꿀 수 있다 → 무한한 서버 증설 가능

     

    * Stateless 한계

    - 모든 것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있다

    - 무상태 - 로그인이 필요없는 단순 소개 화면 / 상태 유지 - 로그인

    - 로그인한 사용자의 경우 로그인했다는 상태를 서버에 유지

    - 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태 유지

    - 상태 유지는 최소한만 사용

     

    ③ 비 연결성( connectionless )

         0. TCP/IP 연결

         1. 요청

         2. 응답

         3. TCP/IP 연결종료

    - HTTP는 기본이 연결을 유지하지 않는 모델

    - 일반적으로 초 단위의 이하의 빠른 속도로 응답

    - 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음

    - 서버 자원을 매우 효율적으로 사용할 수 있음

     

    비연결성 한계와 극복

    - TCP/IP 연결을 새로 맺어야 함 - 3way handshake 시간 추가

    - 웹브라우저로 사이트를 요청하면 HTML 뿐만 아니라 JS,CSS,이미지 등 수 많은 자원이 함께 다운로드

    - 지금은 HTTP 지속연결(Persistent Connections)로 문제 해결

    - HTTP/2, HTTP/3에서 더 많은 최적화

     

    HTTP 메세지

    ① 시작라인

    - start-line = request-line / status-line

     

    요청라인 ( request-line )

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

    - GET /search?q=hello&hI=ko HTTP/1.1

      ㆍHTTP 메서드

               - 종류 : GET,POST,PUT,DELETE

               - 서버가 수행해야 할 동작 지정, GET( 리소스 조회 ), POST( 요청 내역 처리 )

      ㆍ요청 대상 ( /search?q=hello&hl=ko )

               - 절대경로 = "/" 로 시작하는 경로

      ㆍHTTP Version

     

    응답 메세지 ( status-line )

    - status-line = HTTP-version SP status-code SP reason-phrase CRLF

      ㆍHTTP 버전

      ㆍHTTP 상태 코드 : 요청 성공, 실패를 나타냄

                - 200: 성공, 400: 클라이언트 요청 오류, 500: 서버내부오류

      ㆍ이유 문구 : 사람이 이해할 수 있는 짧은 상태 코드 설명 글

     

    ② HTTP 헤더

    - header-field = field-name ":" OWS field-value OWS ( OWS : 띄어쓰기 허용 )

    용도

    - HTTP 전송에 필요한 모든 부가 정보

    - 예 ) 메세지 바디의 내용, 메세지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시관리정보

    - 표준 헤더가 너무 많음

    - 필요시 임의의 헤더 추가 기능

     

    ③ HTTP 메세지 바디

    - 실제 전송할 데이터

    - HTML 문서, 이미지, 영상, JSON 등등 byte로 표현할 수 있는 모든데이터 전송 가능


    HTTP 메서드

    API URI 고민

    - 가장 중요한 것은 리소스 식별

    - ex) 회원 등록,조회,수정,삭제할 때 리소스는 '회원' → 회원 리소스를 URI에 매핑 → /members/{id}

     

    리소스와 행위를 분리

    - URI는 리소스만 식별!

    - 리소스와 해당 리소스를 대상으로 하는 행위를 분리

        ㆍ리소스 : 회원

        ㆍ행위 : 조회, 등록, 삭제, 변경 → HTTP 메서드의 역할

     

    HTTP 메서드 종류

    주요 메서드

    - GET : 리소스 조회

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

    - PUT : 리소스를 대체, 해당 리소스가 없으면 생성

    - PATCH : 리소스 부분 변경

    - DELETE : 리소스 삭제

     

    기타메서드

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

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

    - CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정

    - TRACE : 대상 리소스에 대한 경로에 따라 메세지 루프백 테스트 수행

     

    ① GET

    - 리소스 조회

    - 서버에 전달하고 싶은 데이터는 query(쿼리파라미터, 쿼리스트링)를 통해서 전달

    - 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장 X

     

    ② POST

    - 요청 데이터 처리

    - 메시지 바디를 통해 서버로 요청 데이터 전달

    - 서버는 요청 데이터를 처리 → 메시지 바디를 통해 들어온 데이터를 처리하는 모든 기능을 수행

    - 주로 전달된 데이터로 신규 리소스 등록, 프로세스 처리에 사용

    - 정리 : 이 리소스 URI에 POST 요청이 오면 요청 데이터를 어떻게 처리할지 리소스마다 정해야한다.

         1. 새 리소스 생성 (등록)

         2. 요청 데이터 처리

              ㆍ단순히 데이터를 생성하거나 변경하는 것을 넘어서 프로세스를 처리해야하는 경우

              ㆍPOST의 결과로 새로운 리소스가 생성되지 않을 수도 있음

              ㆍ예 ) POST /orders/{orderId}/start-delivery ( 컨트롤 URI )

         3. 다른 메서드로 처리하기 애매한 경우

              ㆍ예 ) 메시지 바디로 JSON으로 조회 데이터를 넘겨야 하는데, GET메서드를 사용하기 어려운 경우

     

    ③ PUT

    - 리소스를 완전히 대체, 리소스가 없으면 생성

    - 중요! 클라이언트가 리소스를 식별

            ㆍ클라이언트가 리소스 위치를 알고 URI 지정, POST와 차이점

    - 리소스를 수정하는게 아니라 완전히 변경

     

    ④ PATCH

    - 리소스 부분 변경

     

    ⑤ DELETE

    - 리소스 제거

     

    HTTP 메서드의 속성

    안전

    - 호출해도 리소스를 변경하지 않는다.

     

    멱등 ( Idempotent )

    - f(f(x)) = f(x)

    - 한번 호출하든 두번 호출하든 100번 호출하든 결과가 똑같다

    - 멱등 메서드

         GET : 한 번 조회하든, 두 번 조회하든 같은 결과가 조회

         PUT : 결과를 대체한다. 따라서 같은 요청을 여러번 해도 최종 결과는 같다

         ㆍDELETE : 결과를 삭제한다. 같은 요청을 여러번 해도 삭제된 결과는 똑같다

         ㆍPOST : 멱등이 아니다! 두 번 호출하면 같은 결제가 중복해서 발생할 수 있다

    - 활용

         자동 복구 매커니즘

         ㆍ서버가 TIMEOUT 등 으로 정상 응답을 못주었을 때, 클라이언트가 같은 요청을 다시 해도 되는가? 판단 근거

     

    캐시가능 Cacheable

    - 응답 결과 리소스를 캐시해서 사용해도 되는가?

    - GET, HEAD, POST, PATCH 캐시가능

    - 실제로는 GET, HEAD 정도만 캐시로 사용

          POST, PATCH는 본문 내용까지 캐시 키로 고려해야하는데, 구현이 쉽지 않음


    HTTP 메서드 활용

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

     

    데이터 전달 방식

    1. 쿼리 파라미터를 통한 데이터 전송

        ㆍ GET

        ㆍ 주로 정렬 필터 ( 검색어 )

    2. 메시지 바디를 통한 데이터 전송

        ㆍPOST, PUT, PATCH

        ㆍ회원가입, 상품주문, 리소스 등록, 리소스 변경

     

     

    4가지 상황

    1. 정적 데이터 조회

         - 이미지, 정적 텍스트 문서

         - 조회는 GET 사용 , 정적데이터는 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순조회가능

     

    2. 동적 데이터 조회

         - 주로 검색, 게시판 목록에서 정렬 필터 ( 검색어 )

         - 조회는 GET, GET은 쿼리 파라미터 사용해서 데이터를 전달

     

    3. HTML Form을 통한 데이터 전송

         - 회원가입, 상품주문, 데이터 변경

         - POST

              ㆍContent-Type: application/x-www-form-urlencoded 사용

              ㆍform의 내용을 메시지 바디를 통해서 전송 ( key=value, 쿼리 파라미터 형식 )

              ㆍ전송 데이터를 url encoding 처리

    Content-Type 형태가 JSON이 아니다!

         - Content-Type: multipart/form-data

              ㆍ파일업로드 같은 바이너리 데이터 전송시 사용

              ㆍ다른 종류의 여러 파일과 폼의 내용 함께 전송 가능

     

    * 참고 : HTML Form 전송은 GET, POST만 지원

     

     

    4. HTTP API를 통한 데이터 전송

          - 회원가입, 상품주문, 데이터 변경

          - 서버 to 서버, 앱 클라이언트, 웹 클라이언트(Ajax)

          - Content-Type: application/json을 주로 사용 ( 사실상 표준 )


    HTTP API 설계 예시

    회원관리 시스템

    1. API 설계 - POST 기반 등록

         ㆍ회원목록 /members → GET

         ㆍ회원등록 /members → POST

         ㆍ회원조회 /members/{id} → GET

         ㆍ회원수정 /members/{id} → PATCH, PUT, POST

         ㆍ회원삭제 /members/{id} → DELETE

    - 클라이언트는 등록될 리소스의 URI를 모른다

    - 서버가 새로 등록된 리소스 URI를 생성해준다.

    - 컬렉션 ( Collection )

        ㆍ서버가 관리하는 리소스 디렉토리

        ㆍ서버가 리소스의 URI를 생성하고 관리

        ㆍ여기서 컬렉션은 /members

     

    파일관리 시스템

    2. API 설계 - PUT 기반 등록

         ㆍ파일목록 /files → GET

         ㆍ파일조회 /files/{filename} → GET

         ㆍ파일등록 /files/{filename} → PUT

         ㆍ파일삭제 /files/{filename} → DELETE

         ㆍ파일대량등록 /files → POST

    - 클라이언트가 리소스 URI를 알고 있어야 한다.

    - 클라이언트가 직접 리소스의 URI를 지정한다.

    - 스토어 ( Store )

        ㆍ클라이언트가 관리하는 리소스 저장소

        ㆍ클라이언트가 리소스의 URI를 알고 관리

        ㆍ여기서 스토어는 /files

     

    3. HTML FORM 사용

    - HTML FORM은 GET, POST만 지원

    - 컨트롤 URI

         ㆍGET, POST만 지원하도록 제약이 있음

         ㆍ이런 제약을 해결하기 위해 동사로 된 리소스 경로 사용

         ㆍPOST의 /new, /edit, /delete가 컨트롤 URI

         ㆍHTTP 메서드를 해결하기 애매한 경우 사용 ( HTTP API 포함 )

     

     

    정리

    참고하면 좋은 URI 설계 개념

    - 문서 ( document )

         ㆍ단일 개념( 파일 하나, 객체 인스턴스, 데이터베이스 row )

         ㆍ예) /members/100, /files/star.jpg

    - 컬렉션 ( collection )

         ㆍ서버가 관리하는 리소스 디렉터리

         ㆍ서버가 리소스의 URI를 생성하고 관리

         ㆍ예) /members

    - 스토어 ( store )

         ㆍ클라이언트가 관리하는 자원 저장소

         ㆍ클라이언트가 리소스의 URI를 알고 관리

         ㆍ예) /files

    - 컨트롤러 ( controller ), 컨트롤 URI

         ㆍ문서, 컬렉션, 스토어로 해결하기 어려운 추가 프로세스 실행

         ㆍ동사를 직접 사용

         ㆍ예) /members/{id}/delete

     

    참고 자료 : https://restfulapi.net/resource-naming/

    출처 : 인프런 김영한님의 모든 개발자를 위한 HTTP 웹 기본 지식

    https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC

    댓글

Designed by Tistory.