2022.08.15 - http 웹 기본지식 - (2)
1. 웹브라우저 요청 흐름
(1) url로 보냄
(2) 서버를 찾아야함(DNS 서버 조회)
(3) 아이디, 포트 정보 찾음
(4) http요청 메세지를 생성 (get,host등등 정보 들어있음) -> 인터넷 망으로 던짐
(5) 요청 패킷 도착하면 서버가 tcp/ip 패킷을 지우고 http메세지를 해석한다. -> http응답 메세지를 생성함
(6) 응답 패킷이 웹브라우저에 도착 -> 웹브라우저가 HTML랜더링을 한다.
2. HTTP
HTTP 메세지에 모든것을 전송할 수 있다.
html, text, image, 음성, 영상, 파일, json, xml(api) 거의 모든 형태의 데이터를 전송 가능
2-1. HTTP의 특징
- 클라이언트 서버 구조이다.
- 무상태 프로토콜
- 비연결성
- 보낼때도 받을때도 HTTP 메세지로 연결한다.
- 단순하고, 확장성이 좋다.
2-2. HTTP의 클라이언트 서버 구조
- 클라이언트가 http메세지를 통해 서버에 요청을 보내고, 응답을 대기하고,
서버가 요청에 대한 결과를 만들어서 응답한다.
2-3. HTTP는 무상태 프로토콜을 지향한다. (Stateless)
- Stateful, Stateless 의 차이
1) 상태 유지 : stateful (항상 같은 서버가 유지되어야 함)
ex) 중간에 다른 점원으로 바뀔때 상태 정보를 다른 점원에게 미리 알려줘야함.
2) 무상태 : Stateless (아무 서버나 호출해도 됨)
ex) 상태정보를 그때그때 점원에게 전송함. 중간에 점원이 바뀌어도 아무 문제가 없음
-> 갑자기 서버1 장애가 나면 서버2로 전달하면 됨
-> 선착순 이벤트, 명절 ktx등 같은 시간에 딱 맞추어 발생하는 대용량 트래픽사용이 예상될때 최대한 스테이스리스 하게 서버를 설계해야한다!!
- Stateless의 한계
로그인이 필요 없는 단순한 서비스소개 화면에는 괜찮으나 로그인 사용자의 경우 로그인상태를 유지해야하기 때문에 브라우저 쿠키과 서버 세션등을 사용해서 상태유지를 사용한다.
2-4. 비연결성
- 서버가 동시에 유지해야하는 자원을 요청할때만 연결하고 끊어버리기 때문에 최소한의 자원을 사용할 수 있다.
- 초 단위 이하의 빠른 속도로 응답한다.
- 비연결성의 한계
1) TCP/IP 연결을 새로 맺어야한다. (3way handshake 시간 추가됨)
2) 웹브라우저로 사이트를 요청하면 html뿐만 아니라 css, javascript 등 수 많은 자원이 함께 다운로드됨
-> 현재는 HTTP 지속연결(Persistent Connection)로 문제가 해결됨
지속연결 : 연결 요청하고, 응답을 받는다, 그 다음 연결을 유지한다.
2-5. HTTP 메세지
- 요청 메세지와 응답 메세지로 구성되어있고, 구조는 다름
- 요청 메세지
GET/search?q=hello&hl=ko HTTP/1.1
request-line = method SP(공백) request-target SP HTTP-version CRLF(엔터)
- http method : GET, POST, PUT, DELETE ... 서버가 수행해야할 동작을 지정함
GET : 리소스 조회
POST : 요청 내역 처리
- 응답 메세지
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
(시작라인)
status-line = HTTP-version SP status-code SP reason-phrase CRLF
HTTP/1.1 200 OK
- status-code (상태코드) : 200(성공), 400(클라이언트 요청 오류), 500(서버 내부 오류)
(헤더)
header-field : field-name ":" OWS field-value OWS (OWS:띄어쓰기 허용)
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
- http 전송에 필요한 모든 부가정보 포함 (메세지 바디의 내용, 크기, 압축, 인증, 요청 클라이언트(브라우저-크롬 등) 정보, 캐시관리 정보 등등)
3. HTTP 메서드 (HTTP API 만들어보기)
* 좋은 리소스 식별 방법
1) 회원을 등록, 수정, 조회하는것을 모두 배제하고 "회원" 이라는 리소스만 식별하면 된다.
-> 회원 리소스를 URL에 매핑한다.
2) 리소스와 해당 리소스를 대상으로 하는 행위를 분리한다.
리소스 : 회원
행위 : 조회, 등록, 삭제, 변경
3) 리소스는 명사, 행위는 동사 (get, post....)