---
# System prepended metadata

title: Day16 - 학습정리
tags: [2020 Boostcamp]

---

###### tags: `2020 Boostcamp`
# Day16 - 학습정리

### 스스로 확인할 사항

- **HTTP Request 종류와 HTTP Response 종류에 대해 학습하고 정리한다.**

  - HTTP Request

    | HTTP Request |           Operation           |
    | :----------: | :---------------------------: |
    |     GET      | 존재하는 자원에 대한 **요청** |
    |     POST     |    새로운 자원을 **생성**     |
    |     PUT      | 존재하는 자원에 대한 **변경** |
    |    DELETE    | 존재하는 자원에 대한 **삭제** |

  - HTTP Response

    | HTTP Response Status Code |                                                              |
    | ------------------------- | ------------------------------------------------------------ |
    | 2xx - 성공                | `200번대의 상태 코드는 대부분 성공을 의미합니다.` 200 : GET 요청에 대한 성공 204 : No Content. 성공했으나 응답 본문에 데이터가 없음 205 : Reset Content. 성공했으나 클라이언트의 화면을 새로 고침하도록 권고 206 : Partial Conent. 성공했으나 일부 범위의 데이터만 반환 |
    | 3xx - 리다이렉션          | `300번대의 상태 코드는 대부분 클라이언트가 이전 주소로 데이터를 요청하여 서버에서 새 URL로 리다이렉트를 유도하는 경우입니다.` 301: Moved Permanently, 요청한 자원이 새 URL에 존재  303: See Other, 요청한 자원이 임시 주소에 존재 304 : Not Modified, 요청한 자원이 변경되지 않았으므로 클라이언트에서 캐싱된 자원을 사용하도록 권고. [ETag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag)와 같은 정보를 활용하여 변경 여부를 확인 |
    | 4xx - 클라이언트 에러     | `400번대 상태 코드는 대부분 클라이언트의 코드가 잘못된 경우입니다. 유효하지 않은 자원을 요청했거나 요청이나 권한이 잘못된 경우 발생합니다.` 400: Bad Request, 잘못된 요청 401: Unauthorized, 권한 없이 요청. Authorization 헤더가 잘못된 경우 403: Forbidden, 서버에서 해당 자원에 대해 접근 금지 404: 요청한 자원이 서버에 없음 405: Method Not Allowed, 허용되지 않은 요청 메서드 409: Conflict, 최신 자원이 아닌데 업데이트하는 경우. ex) 파일 업로드 시 버전 충돌 |
    | 5xx - 서버 에러           | `500번대 상태 코드는 서버 쪽에서 오류가 난 경우입니다.` 501: Not Implemented, 요청한 동작에 대해 서버가 수행할 수 없는 경우 503: Service Unavailable, 서버가 과부하 또는 유지 보수로 내려간 경우 |

- **운영체제에서 HTTP Proxy를 개발한 주소로 설정하고 웹 브라우저가 동작하는 지 확인한다.**

  * 동작하지 않음‼️

- **리눅스 또는 CLI 환경에서 wget 이나 curl 명령 사용법을 학습하고, HTTP Proxy 동작을 대해 학습한다.**

  * wget(= web get)

    * 웹 상에서 파일을 다운로드 받을 때 사용되는 명령어로 비 상호작용 네트워크 다운로더

    * HTTP, HTTPS, FTP 프로토콜을 지원하며, HTTP proxy에서 데이터를 가져올 수도 있음

    * 기본 형태: `wget [옵션]... [URL]...`

      ```
      wget --tries=10 https://www.naver.com/byk.tgz # 응답이 없는 다운로드 시도에 대해 재시도하는 횟수
      wget --ftp-user=byk --ftp-password=bykpw ftp://ftp.naver.com/byk.tgz # ftp 프로토콜로 제공되며 로그인 계정 정보를 입력
      wget -c https://www.naver.com/byk.tgz # 이전에 다운로드 받닥가 중단된 파일을 이어서 다운로드
      ```

      

  * curl

    * 클라이언트에서 커맨드 라인이나 소스코드로 손 쉽게 웹 브라우저 처럼 활동할 수 있도록 해주는 명령어(커맨드라인 Tool 혹은 라이브러리)

    * 서버와 통신할 수 있는 커맨드 명령어 툴로서 웹개발에 매우 많이 사용되고 있는 무료 오픈소스

    * 다양한 프로토콜들을 지원

      - DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet, TFTP, SSL(도 가능)

    * url을 가지고 할 수 있는 것들은 다할 수 있습니다.

    * REST API 사용시 자주 사용되는 cURL 옵션들

      - -i: 응답 헤더 출력 (옵션 없으면 응답 본문만 출력함)
      - -v: 중간 처리 과정, 오류 메시지, 요청 메시지와 응답 메시지를 헤더와 본문을 포함해 전체 출력
      - -X: 요청 메소드를 지정 (옵션 없으면 기본값은 GET)
      - -H: 요청 헤더를 지정
      - -d: POST 리퀘스트에서 데이터를 지정

      ```
      curl -X POST http://localhost:7000/api/users/byk
      curl -H "Content-Type: application/x-www-form-urlencoded" -X POST http://localhost:7000/api/users/byk
      curl -d "name=byk" -H "Content-Type: application/json" -X POST http://localhost:7000/api/users
      ```

      

  #### 3-3 HTTP Proxy 동작

  [![img](https://camo.githubusercontent.com/69bc90d9f8c5fe28e048cd180c4324020583f6d8/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f636f6d6d6f6e732f7468756d622f322f32372f4f70656e5f70726f78795f68326732626f622e7376672f33353070782d4f70656e5f70726f78795f68326732626f622e7376672e706e67)](https://camo.githubusercontent.com/69bc90d9f8c5fe28e048cd180c4324020583f6d8/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f636f6d6d6f6e732f7468756d622f322f32372f4f70656e5f70726f78795f68326732626f622e7376672f33353070782d4f70656e5f70726f78795f68326732626f622e7376672e706e67)

  웹 Proxy 서버는 클라이언트의 입장에서 트랜잭션을 수행하는 대리인 혹은 중개인. Proxy 서버는 웹 서버이기도 하며 웹 클라이언트 이기도 하기 때문에, `직접 구축하기 위해서는 클라이언트와 서버 양쪽 규칙을 모두 주의 깊게 따라야 함.`

  - 공용 Proxy와 개인 Proxy
    - 클라이언트가 독점적으로 사용하면 개인, 여러 클라이언트가 공유한다면 공용
    - 주로 공용 Proxy가 많은데, 그 이유는 다수의 클라이언트의 공통 요청에 따른 이득(캐싱 등)이 있기 때문
  - Proxy와 Gateway의 차이점?
    - Gateway는 서로 다른 프로토콜을 사용하는 둘 이상의 어플리케이션을 연결하지만, Proxy는 같은 프로토콜을 사용하는 둘 이상의 어플리케이션을 연결
    - Gateway는 서로 다른 프로토콜 통신에 대해 트랜잭션을 변환해줄 수 있음
    - Proxy도 서로 다른 HTTP 프로토콜 버전 통신에 대한 처리(=변환)를 해주긴 함
  - Proxy의 장점
    1. 보안 개선
       - HTTP 메세지에서 신원을 식별할 수 있는 특성들을 제거함으로서 개인 정보 보호와 익명성을 보장할 수 있습니다. (IP주소, From 헤더, Referer 헤더, 쿠키, URI 세션 아이디...)
       - Proxy 서버는 조직 안에 들어오거나 나가는 응용 레벨 프로토콜의 흐름을 네트워크의 한 지점에서 통제합니다. 바이러스를 제거하기 위해 트래픽을 세심히 살펴볼 수 있는 hook을 제공합니다.
       - 많은 웹 서버들과 웹 리소스에 대한 단일한 접근 제어 전략을 구현하고 감사 추적을 하기 위해 사용 될 수 있습니다. (기업이나 국가에서 유튜브 등 인터넷 컨텐츠 접근 권한 제어)
    2. 성능 향상
       - 대리 프락시(Surrogate) (= 서버 가속기): 어떤 프락시들은 웹 서버인 것처럼 위장합니다. 대리 프락시는 공용 컨텐츠에 대한 느린 웹 서버의 성능을 개선하기 위해 사용될 수 있습니다. **컨텐츠 라우팅 기능(인터넷 트래픽 조건과 종류에 딸라 특정 웹 서버로 유도하는 기능)**과 결합되어 주문형 복제 컨텐츠의 분산 네트워크 용도로도 사용됩니다.
    3. 비용 절약
       - 웹 캐시: 인기 있는 문서의 로컬 사본을 관리하고 해당 문서에 대한 요청이 오면 빠르게 제공하여 리소스를 효율적으로 사용할 수 있습니다.
    4. HTTP 트래픽 모니터링, 수정
       - Proxy 서버는 컨텐츠를 클라이언트에게 전달하기 전에 본문 포맷을 수정 할 수 있습니다. 이와 같은 표현 방식의 변환을 **트랜스코딩**이라 한다.

  ### 

### 다같이 확인할 사항

- **네트워크로 요청을 보내고 응답을 받는 과정을 WireShark 같은 네트워크 패킷 분석 도구를 통해서 확인한다**.
- **WireShark 도구가 동작하는 원리에 대해 학습한다.**
  - 패킷 스니핑
    - 스니핑 : 네트워크 상에서 자신 이외의 사용자들의 패킷을 엿보는 것
      - 초기 tcp/ip 프로토콜은 보안적 측면을 고려하지 않고 평문통신을 했기 때문에 취약
    - pcap을 이용하여 패킷을 잡아냄