Spring 강의/network

[network] - (3) HTTP 기본

lxexjx 2022. 4. 4. 16:45

[HTTP]
HyperText Transfer Protocol : 문서간의 링크를 통해서 연결하는 html을 전송하는 프로토콜
거의 모든 형태의 데이터 전송 가능.

클라이언트 서버 구조, 무상태 프로토콜, 비연결성,단순, 확장 가능


[클라이언트와 서버의 구조]
1. 클라이언트와 서버 구조
http는 클라이언트가 http메세지를 통해서 보내고 서버에서 응답이 올때 까지 기다려. 서버가 요청에 대한 결과를 만들어서 응답해

클라이언트가 request를 보내면 서버가 응답할때까지 기다렸다가 응답을 받고 동작.


* 클라이언트와 서버를 분리하는게 중요*
비지니스 로직이랑 데이터는 서버에 넣고 클라이언트는 UI와 사용성에 집중-> 클라이언트와 서버가 독립적으로 진화

[Stateful, Stateless]
2. 무상태 프로토콜
서버가 클라이언트 상태를 보존하지 않는다.

*Stateful : 상태를 유지한다. (로그인). 최소한으로만 사용
서버가 클라이언트 이전 상태를 보존한다. -> 중간에 상태가 변경되면 장애가 발생
중간에 다른 점원으로 바뀔 때 상태 정보를 다른 점원에게 미리 알려줘야됨. 서버 늘리기 어려워


애초에 처음부터 정보를 다 담아서 보내고 그냥 2번에 보내면 됨.

*Stateless : 상태를 유지하지 않는다. (단순 서비스 소개 화면)
서버가 클라이언트의 상태를 보존하지 않는다. -> 고객이 필요한 정보를 그때 그때 다 넘겨줘서 중간에 바뀌어도 문제없
갑자기 고객이 증가해도 점원을 대거 투입 가능하고 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입 가능.
응답 서버를 쉽게 바꿀 수 있음-> 무한한 서버 증설 가능



[비연결성]

1,2,번이 요청을하고 응답을 받고 3도 요청을 하고 응답을 받는동안 1,2번은 연결이 유지

 

다시 1번이 새로운 요청을 하면 서버가 응답

단점: 2,3 클라이언트가 놀고 있어도 계속 연결을 유지해야됨.

TCP/IP연결을해서 요청을 하고 응답을 받아
응답 다 받았으면 연결 끊어버려
자원 요청을 주고 받을 때만 연결하고 끊어버려서 서버를 유지하는 자원을 최소한으로 줄여


=> http는 기본적으로 연결을 유지하지 않는 모델로 빠른속도로 응답. 서버 자원을 효율적 사용 가능
but, 중간에 다른거 하면 TCP/IP를 새로 연결 해야돼 -> 3 way handshake 시간 추가

요청하고 응답하고... 몇초 동안 연결을 유지해



[HTTP메세지]

1. 시작 라인
* 요청 메세지(request-line) - HTTP method(ex : GET 조회), request-target(path), HTTP-version
HTTP method - GET:서버에게 리소스를 달라고 해/POST: 요청한것들 처리해줘...
path 절대경로+ 쿼리


*응답 메세지(status-line) - HTTP-version, status-code(클라이언트가 보낸 요청이 성공했는지 실패했는지 나타냄), reason-phrase (상태코드를 사람이 이해할 수 있게 문자로 나타낸것 ex :OK) CRLF


2. 헤더 라인 : HTTP 전송에 필요한 모든 부가정보 들어있음.

메세지 바디를 제외하고 필요한 메타정보 다 들어있음.

3. 메세지 바디 라인 : 실제 전송할 데이터