토이 프로젝트 제작과 더불어 인터넷 통신의 이론적인 부분을 학습하고
간단한 예제로 감을 잡고 가면 내 작업도 훨씬 수월할 거 같다고 생각하여 이번 강의를 수강하고 정리하였다.
인터넷 네트워크
- IP(인터넷 프로토콜)
- 지정한 IP 주소에 데이터를 전달한다.
- 특정 패킷이라는 것을 가지고 전달한다, 일종의 형식이라고 생각하자
- IP패킷: 출발지 IP, 도착지 IP,,,
- 전달
- 클라이언트 -> 서버
- 서버 -> 클라이언트
- 한계
- 비연결성
- 만약 받는 사람 인터넷이 꺼져있다면?
- 비신뢰성
- 패킷이 전달 도중에 사라진다면?
- 패킷의 전달 순서가 달라진다면?
- 프로그램 구분
- 같은 컴퓨터에서 게임도 하고 음악도 듣고 하는데 어떻게 구분하지?
- 비연결성
- TCP (Transmission Control Protocol)
- IP에 TCP를 덧붙여서 IP 패킷을 전송한다고 보면 된다.
- TCP에는 출발지 port, 도착지 port, 전송 제어, 순서, 검증 정보,,
- 연결지향 3 way handshake
- 클라이언트 -> 서버: syn (접속 요청)
- 서버 -> 클라이언트: syn + ack(요청 수락)
- 클라이언트 -> 서버: ack /'신 신액 액' 으로 생각해보자
요즘은 3번 ack에서 데이터를 함께 전송 가능하다. - 따라서 신뢰할 수 있는 프로토콜이지만, 이는 논리적, 개념적으로 연결 되었다는 것을 알아두자.
실제 물리적인 연결은 여러 서버들을 거쳐서 도달한다!
- 데이터 전달 보증
- 서버가 데이터를 전달 받으면 확인 데이터를 보내준다.
- 순서 보장
- TCP에는 패킷 순서를 보장하는 것이 들어있다.
- 연결지향 3 way handshake
- UDP (User Datagram Protocol)
- 하얀 도화지 / 기능이 거의 없다
- IP 기능 + PORT + 체크섬 기능 => 요즘 각광받고 있다.
- PORT => 같은 IP 내에서 여러 작업을 수행하는 경우 구분이 가능하게 한다.
- IP는 목적지 IP를 가지고, PORT는 같은 IP내에서 프로세스를 구분한다
- TCP/IP 패킷: 출발지 IP, PORT / 목적지 IP, PORT / 전송 데이터 이런 둘이 합쳐진 정보들
- 0 ~ 65535: 할당 가능
- 0 ~ 1023: 사용하지 않는 것이 좋다
- HTTP 80 포트: 웹 브라우저
- HTTPS 443 포트: 보안이 추가된 웹
- DNS (Domain Name System)
- IP가 변경될 수 있다.
- 도메인 명을 IP주소로 변환해서 제공하는 일종의 IP 전화번호부
URI
uniform: 식별할 수 있는 통일된 방식
resource: URI로 식별할 수 있는 모든 것 (실시간 정보, 날씨,,제한이 없음)
identifier: 다른 항목과 구분되는데 필요한 정보
URI > URL, URN
- URL: 리소스가 있는 위치를 지정
- URN: 리소스 그 자체에 이름을 부여
- URN만으로 실제 리소스를 찾는 방법은 보편화 되지 않음
- 따라서 URI, URL을 잘 기억하자
- URL 분석
🔎 hello: Google 검색
www.google.com
- scheme://[userinfo@]host[:port][/path][?query][#fragment] 이런 형태의 문법을 가진다.
- scheme 프로토콜: 어떤 방식으로 접근할 지
- http 는 80이 붙고, https 는 443 (요즘은 거의 다 443, http에 강력한 보안이 포함된 것)
- userinfo: URL에 사용자 정보 포함해서 인증
거의 사용안함 - host: 호스트명, 도메인명이나 IP주소를 직접 사용할 수도 있다.
- PORT: 일반적으로 생략, 생략 시 http - 80 / https - 443
- path: 리소스 경로 (/members, /members/100,,,)
- query: key=value 형태, 웹 서버에 제공하는 파라미터
- scheme 프로토콜: 어떤 방식으로 접근할 지
웹 브라우저 요청 흐름
<클라이언트>
- DNS 조회
- 웹 브라우저가 HTTP요청 메시지 생성
- socket통해서 TCP/IP 연결
- OS 계층에서 TCP/IP 패킷 생성, 메시지 포함
<서버>
- 응답 메시지 생성
- 응답 패킷 전달 (위와 같은 방법으로)
- 클라이언트가 메시지를 렌더링해서 띄운다.
HTTP 통신
HyperText Transfer Protocol
http로 모든 것을 전송한다. 모든 형태의 데이터
- 기반 프로토콜
- HTTP/1.1 이나 HTTP/2 는 TCP 기반
- HTTP/3 은 UDP 기반
- 현재는 1.1을 주로 사용하지만, 2나 3도 점점 증가하고 있다.
- 특징
- 클라이언트 서버 구조
- 무상태 프로토콜
- HTTP 메시지
- 단순함
- 클라이언트와 서버 구조
- 클라이언트는 서버에 요청을 보내고, 응답을 대기
- 서버가 요청에 대한 결과를 만들어서 응답
- 클라이언트와 서버가 각각 독립적으로 진화
클라이언트는 UI에 집중 / 서버는 로직, 데이터에 집중
- 무상태 프로토콜 stateless (제일 중요!) - 항상 무상태로 설계하자
- 서버가 클라이언트의 상태를 보존하지 않는다.
- 예시: 점원 교체
- 상태 유지: 중간에 점원이 바뀌면 상태 정보를 다른 점원에게 미리 알려줘야 함
- 무상태: 중간에 점원이 바뀌어도 된다.
- 스케일 아웃 - 수평 확장에 유리하다: 트래픽이 많아지면 서버를 대폭 늘릴 수 있다.
- 모든 것을 무상태로 설계할 수 있는 경우와 없는 경우가 있다.
- 비연결성
- HTTP는 연결을 유지하지 않는 모델, 초 단위의 빠른 속도로 응답
- 동시에 처리하는 요청은 수십 개 이하로 매우 작다.
- 서버 자원을 효율적으로 사용할 수 있다!
- 단점
TCP/IP 연결을 새로 맺어야 한다
HTML 뿐만 아니라 새로운 자원이 함께 다운로드된다
현재는 HTTP2, 3에서 더 많은 최적화가 되었다
지금은 지속 연결으로 해결!
- 단점
- HTTP 메시지 => 요청 메시지 / 응답 메시지
- 시작 라인
- HTTP 요청 메시지에서는 request-line 이라고 한다
- HTTP 메서드: Get, Post,,
- 요청 대상: 절대경로 "/"로 시작
- HTTP 버전
- 위 3가지가 들어간다.
- HTTP 응답 메시지에서는 status-line 이라고 한다.
- HTTP 버전
- HTTP 상태 코드: 요청 성공, 실패를 나타낸다
- 이유 문구: 사람이 읽을 수 있는 짧은 문구
- 2가지가 들어간다.
- HTTP 요청 메시지에서는 request-line 이라고 한다
- 헤더
- field-name과 value가 있다.
- field-name은 대소문자 구분이 없다
- 용도
- HTTP 전송에 필요한 모든 부가정보
- 필요시 임의의 헤더를 추가할 수 있다.
- 메시지 바디
- 실제 전송할 데이터
- byte로 표현할 수 있는 모든 데이터 (사진, JSON, HTML ,,,,)
- 시작 라인
HTTP는 단순하고 확장 가능하다.
메세지에 모든 것을 전송할 수 있다.
김영한 강사님: '바야흐로 지금은 HTTP 시대입니다'
HTTP 메서드
- 요구사항
- 회원 목록 조회: read
- 회원 조회: read
- 회원 등록: create
- 회원 수정: update
- 회원 삭제: delete
- URI 설계
- 리소스 식별을 기준으로 설계해야 한다!
- 요구사항에서는 '회원'이 리소스 / '조회', '등록' 등은 메서드이다.
- 리소스와 행위를 분리해야 한다.
- 행위: 조회, 등록, 삭제, 변경
- 리소스는 명사 / 행위는 동사
- HTTP 메서드 - 행위
- 클라이언트가 서버에 요청할 때 기대하는 것
- GET: 리소스 조회
- POST: 요청 데이터 처리, 주로 등록에 사용
- PUT: 리소스를 대체
- PACTH: 리소스 부분 변경
- DELETE: 리소스 삭제
- GET
- 서버에 전달하고 싶은 데이터는 query를 통해서 전달
- 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 많이 사용하지 않는다.
- POST
- 메시지 바디를 통해 서버로 요청 데이터를 전달
- 서버는 요청 데이터를 처리
- 데이터를 처리하는 모든 기능을 다 수행한다.
- 변경을 넘어서서 프로세스를 처리해야 하는 경우
- 새로운 리소스가 생성이 안될 수도 있다.
- POST/orders/{orderId}/start-delivery (컨트롤 URI에도 사용된다.)
- 새 리소스를 생성하거나 등록하는데 사용한다.
- 다른 메서드로 처리하기 애매한 경우
- JSON으로 조회 데이터를 넘겨야 하는데, GET메서드를 사용하기 어려운 경우
- 애매하면 POST
- PUT
- 리소스를 대체
- 리소스가 있으면 대체
- 리소스를 완전히 대체한다
- 기존 리소스를 삭제하고 덮어만든다고 생각하기!
- 리소스가 없으면 생성
- 덮어버린다고 생각하자!
- 리소스가 있으면 대체
- 클라이언트가 리소스 식별
- 클라이언트가 리소스 위치를 알고 지정
- PUT/members/100 HTTP/1.1 이런 식
- 클라이언트가 리소스 위치를 알고 지정
- 리소스를 대체
- PATCH
- 리소스 부분 변경 PUT과 다르다!
- DELETE
- 리소스 제거
- 클라이언트가 서버에 요청할 때 기대하는 것
- HTTP 메서드의 속성
- 안전: 여러 번 호출해도 리소스를 변경하지 않는다.
- 해당 리소스가 변하는지 여부에 대해서만 고려
- 멱등 Idempotent: 한 번 호출하든 두 번 호출하든 100번 호출하든 결과가 똑같다.
멱등은 외부 요인으로 중간에 리소스가 변경되는 것까지는 고려하지 않는다.
GET => 중간에 PUT으로 바꾸고 => GET 멱등하지 않다고 판단
- GET: 한 번 조회든 두 번 조회든 같은 결과가 조회
- PUT: 결과를 대체, 같은 요청을 여러 번 해도 최종 결과 같음
- DELETE: 결과를 삭제, 여러 번 요청해도 삭제된 결과는 똑같다.
- POST: 멱등이 아니다! 중복 결제 등
- 자동 복구 매커니즘에 활용한다.
<서버가 TIMEOUT 등으로 정상 응답을 못주었을 때,
클라이언트가 같은 요청을 다시 해도 되는가에 대한 판단 근거>
- 캐시 가능
- 응답 결과 리소스를 캐시
- GET, HEAD, POST, PATCH 캐시 가능
- 실제로는 GET, HEAD 정도만 캐시로 사용
- 안전: 여러 번 호출해도 리소스를 변경하지 않는다.
클라이언트에서 서버로 전송
- 쿼리 파라미터를 통한 데이터 전송
- GET에서 주로 사용한다.
- 정렬 필터(검색어)에 주로 활용한다.
- 메시지 바디를 통한 데이터 전송
- POST, PUT, PATCH를 주로 사용
- 회원 가입, 상품 주문, 리소스 등록 변경 등에 주로 사용한다.
<여러 가지 상황>
- 정적 데이터 조회
- GET 사
- 이미지, 정적 텍스트 문서
- 일반적으로 쿼리 파라미터 없이 리소스 경로로 단순하게 조회가 가능하다.
- 동적 데이터 조회
- 검색, 게시판 목록에서 검색
- 조회 조건을 줄여주는 필터, 조회 결과를 정렬하는 정렬 조건에 주로 사용
- GET은 쿼리 파리미터 사용해서 데이터를 전달
- HTML FORM 데이터 전송
- POST 전송 (key - value 방식으로 서버에 전송)
- 웹 브라우저가 요청 HTTP 메시지를 생성한다.
- content-type 이라는 것이 있다.
Content-Type: application/x-www-form-urlencoded
이것이 form의 내용을 메시지 바디를 통해 전송하게 해준다. / url encoding 처리
- GET 전송
- 조회하는 기능에 사용하여 데이터를 전송한다.
- multipart/form-data
- 이름, 나이, 이미지를 같이 보낼 때 사용한다. => 여러 종류의 파일과 폼의 내용을 함께 전송 가능하다.
- content-type 이 multipart/form-data 가 되면서 웹 브라우저가 영역을 나누어서
요청 HTTP 메시지를 생성한다.
- content-type 이 multipart/form-data 가 되면서 웹 브라우저가 영역을 나누어서
- 이름, 나이, 이미지를 같이 보낼 때 사용한다. => 여러 종류의 파일과 폼의 내용을 함께 전송 가능하다.
- HTML FORM 전송은 POST / GET 만 사용 가능!!
- POST 전송 (key - value 방식으로 서버에 전송)
- HTTP API 전송
- 서버끼리 통신할 때 많이 사용한다.
- 앱 클라이언트에서 전송할 때 사용
- 웹 클라이언트 통신
- HTML FORM 전송 대신 자바 스크립트를 통한 통신에 사용 (AJAX)
리액트, 뷰 같은 것들
- HTML FORM 전송 대신 자바 스크립트를 통한 통신에 사용 (AJAX)
- POST, PUT, PATCH: 메시지 바디로 데이터 전송
- GET 조회 : 쿼리 파라미터로 데이터 전달!
- Content-type: application/json 을 주로 사용
HTTP API 설계
- HTTP API - 컬렉션 => 대부분 이것을 사용한다!
- 회원 관리 시스템 (POST 기반 등록)
- 클라이언트가 리소스 URI 를 알지 못한다.
- 서버가 URI를 생성하여 관리한다.
- HTTP API - 스토어
- 파일 관리 시스템 (PUT 기반 등록)
- 클라이언트가 리소스를 지정한다.
- 클라이언트가 리소스를 직접 관리한다.
- HTML FORM 사용 (순수 HTML 폼 가정)
- GET, POST 만 지원
- 컨트롤 URI 사용 -> POST 기반 등록에서도 사용한다!
- GET, POST만 지원되기 때문에 제약이 있다.
- 동사로 된 리소스 경로를 사용한다.
- /edit, /delete 등
- /members/{id}/edit 이런 식
이론으로 살펴보았고 HTTP API 설계 부분은 토이 프로젝트로 직접 설계하며 복습할 예정이다.
다음은 상태코드와 헤더의 기능에 대해 학습할 예정이다!