Internet Protocol (인터넷 프로토콜)
packet
[출발지IP][목적지IP][기타][전송데이터] 의 규칙으로 전송IP 프로토콜의 한계
비연결성
비신뢰성
패킷의 전송 속도차나 환경차이에 의한 순서의 확실성이 불확실함프로그램 구분
애플리케이션 계층
전송 계층
인터넷 계층
네트워크 인터페이스 계층
위 그림으로 다시 설명하자면 Hello, world라는 메세지를 애플리케이션 계층에 해당하는 chrome application에서 socket library를 통하여 OS에 해당하는 전송 계층의 TCP로 전달하여 TCP 정보를 생성하고 다시 인터넷 계층의 IP로 정보가 전달되어 IP 패킷에 정보를 담아 트워크 인터페이스 계층으로 전달되어져 LAN을 통해 데이터가 전송되어진다.
연결지향
실제로 물리적으로 연결된 상태는 아니며 논리적인 연결 상태데이터 전달 보증
순서 보장
3 way handshake
SYN
접속 요청
ACK
요청 수락
Uniform Resource Identifier
Uniform
리소스 식별하는 통일된 방식Resource
자원, URI로 식별할 수 있는 모든 것Identifier
다른 항목과 구분하는데 필요한 정보URL
Locator
리소스가 있는 위치를 지정scheme
userinfo
port
path
query
fragment
URN
Name
리소스에 이름을 부여GET /search?q=hello&hl=ko HOST: www.google.com
HTTP/1.1 200 OK Content-Type: text/html;charset=UTF-8 Content-Length: 3423 <html> <body> ... </body> </html>
HyperText Transfer Protocol
HTTP 역사
클라이언트 서버 구조
독립적
구조이며 client는 요청을 보내고 server는 응답을 대기하면서 요청에 대한 결과를 만들어 응답한다.Stateful, Stateless
connectionless (비 연결성)
장점
1. HTTP는 기본이 연결을 유지하지 않는 모델
2. 1시간 동안 수천명이 서비스를 사용해도 실제 서버로 요청을 보내는 요청은 그 수에 비해 현저히 작다
3. HTTP에서는 요청이 들어왔을 때 결과 값을 반환하고 연결을 끊는다.
4. 자원의 소모가 적다.
단점
1. TCP/IP 연결을 새로 맺어야함 - 3 way handshake를 다시 해야함
2. HTML 뿐만 아니라 javascirpt, css, image 등 수 많은 자료를 연결될 때마다 다운로드
3. HTTP 지속 연결 (Persistent Connections)로 문제 해결
4. HTTP2/HTTP3 에서 개선
요청 메세지 - 시작라인
request-line
request-line
'http method' + '(공백)' + '/' + '요청대상' + '(공백)' + '/' + 'version' 의 구조http method
get - 조회요청대상
version
응답 메세지 - 시작라인
status-line
status-line
'version' + '/' + status-code + '/' + 'reason-phrase'version
status-code
400 : 클라이언트 요청 오류reason=phrase
HTTP HEADER
OWS
field-valueOWS
(OWS:띄어쓰기 허용)HTTP 메세지 바디
HTTP는 매우 단순하며 확장도 가능함
HTTP 설계
조회
get
/members조회
get
/members/{id}등록
post
/members/{id}수정
put
/members/{id}삭제
delete
/members/{id}요구사항에 따른 URI 설계
조회
,등록
,수정
,삭제
)는 메서드가 됨메서드의 종류
POST
요청, 등록PUT
대체POST
와 차이점은 클라이언트가 리소스 위치를 알고 URI 지정하여 사용PATCH
부분 변경put
과 다르게 부분적인 필드값만 보내면 해당 필드만 수정됨)DELETE
삭제GET
조회OPTIONS
대상 리소스에 통신 가능 옵션을 설명TRACE
리소스 경로를 따라 메세지 루프백 테스트 수행CONNECT
대상 자원으로 식별되는 서버에 대한 터널 설정HEAD
GET과 동일하지만 상태줄과 헤더만 반환HTTP 메서드 속성
안전
GET
, HEAD
멱등
GET
, PUT
, DELETE
멱등
이 필요한 이유는 멱등
한 메서드는 몇번을 호출해도 결과가 동일하고 리소스에 미치는 영향이 동일하기 때문에 서버 내부의 이유로 정상 응답을 못 주었을 때, 클라이언트가 같은 요청을 동일하게 반복해도 되는지에 대한 판단 근거가 될 수 있다.캐시가능
GET
, HEAD
, POST
, PATCH
GET
, HEAD
정도만 캐시로 사용POST
, PATCH
는 본문 내용까지 캐시 키로 고려해야하는데 구현이 쉽지 않다.1. 쿼리 파라미터를 통한 데이터 전송 - GET - 정렬 필터(검색어)
2. 메세지 바디를 통한 데이터 전송 - POST, PUT, PATCH - 회원가입, 상품주문, 등록, 변경
1. 정적 데이터 조회 ex) /static/start.jpg
- 쿼리 파라미터 없이 리소스 경로로 단순하게 조회
- GET 사용
2. 동적 데이터 조회 ex) /search?q=hello&hl=ko
- GET 사용
- 쿼리 파라미터를 사용해서 데이터 전달
- 주로 검색, 게시판 필터로 사용
3. HTML Form 데이터 전송
- GET, POST 전송가능
- GET = 쿼리 파라미터로 전송됨
- POST = 메세지 바디로 전송됨
- multipart/form-data 파일을 전송하기 위한 Content-Type
4. HTTP API 데이터 전송
- 서버와 서버간의 백엔드 시스템 통신
- ajax 통신
- 주로 Content-Type: application/json 을 사용`
참고
https://restfulapi.net/resource-namingPOST
기반회원 등록 POST
/members회원 수정 PATCH
PUT
POST
/members/{id}
1. 클라이언트의 요청 POST /members
2. server에서 새로 등록된 리소스에 대한 URI값을 반환해준다.
응답 데이터 예시
HTTP/1.1 201 Created
Content-Type: application/json
Content_Length: 33
Location: /members/100
{
"username": "choi",
"age": 28
}
3. 이러한 형식을 컬렉션(Collection)이라 부른다.
서버가 관리하는 리소스 디렉토리
서버가 리소스 URI를 생성하고 관리
회원 삭제 DELETE
/members/{id}
회원 조회 GET
/members/{id}
회원 목록 GET
/members
PUT
기반 (파일이 존재한다면 지우고 새로 생성하는게 맞기 때문에 파일 예시가 제일 적당)파일 조회 GET
/files/{filename}파일 삭제 DELETE
/files/{filename}
1. 클라이언트가 리소스 URI를 알고 있어야한다.
POST와는 다르게 등록시에도 클라이언트에서 리소스의 URI를 직접 지정해서 등록하게된다.
2. 이러한 형식을 스토어(Store)이라 부른다.
클라이언트가 관리하는 리소스 저장소
클라이언트가 리소스의 URI를 알고 관리함
파일 대량 등록 POST
/files
파일 등록 PUT
/files/{filename}
파일 목록 GET
/files
HTML Form 기반 (GET
POST
만 지원)회원 등록 폼 GET
/members/new회원 조회 GET
/members/{id}회원 수정 POST
/members/{id}/edit
1. HTML Form은 GET, POST만 지원
2. GET, POST만 지원하기 때문에 여러 제약이 있고 이 제약을 해결하기 위해 컨트롤 URI를 사용
- /new, /edit, /delete가 컨트롤 URI
3. HTTP 메서드로 해결하기 애매한 경우 컨트롤 URI를 사용
회원 삭제 POST
/members/{id}/delete
회원 수정 폼 GET
/members/{id}/edit
회원 등록 POST
/members/new
회원 목록 GET
/members
1XX (Informational)
2XX (Successful)
200
Ok201
Created202
Accepted204
No Content3XX (Redirection)
요청을 완료하기 위해 유저 client에 추가 조치 필요
웹 브라우저는 3xx 응답에 location 값이 존재하면 location uri로 리다이렉션
영구적 리다이렉션
301 Moved Permanently
- 리다이렉트 요청시 요청 메서드가 GET으로 변경되고 본문이 제거될 수 있음
308 Pernanent Redirect (영구 리다이렉션)
- 301 상태코드와 기능은 동일
- 리아이렉트 요청시 요청 메스드와 본문 유지
일시적인 리다이렉션
302 Found
- 리다이렉트시 요청 메서드가 GET으로 변하고 본문이 제거될 수 있음
307 Temporary Redirect
- 302와 기능 같음
- 리다이렉트시 요청 메서드와 본문 유지
303 See Other
- 302와 기능 같음
- 레다이렉트시 요청 메서드가 GET으로 변경
기타 리다이렉션
300 Multiple Choices
- 잘 안씀
304 Not Modified
- 캐시를 목적으로 사용
- 클라이언트의 리소스가 수정되지 않았음을 알려주고 클라이언트는 로컬 PC에 저장된 캐시를 재사용한다.
- 캐시를 재사용하므로 네트워크 다운로드 사용량이 줄어듦
- 304 응답은 메세지 바디를 포함하면 안된다. (로컬 캐시를 사용하므로)
4XX (Client Error)
400 Bad Request
- 요청 내용이 오류
- 클라이언트는 요청 내용을 수정해서 다시 보내야함
401 Unauthorized
- 클라이언트가 해당 리소스에 대한 인증이 필요
- 401 오류 발생시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명
403 Forbidden
- 서버가 요청을 이해했지만 승인을 거부함 - 접근 권한이 없는 경우
404 Not Found
- 요청 리소스 서버가 존재하지 않음
- 또는 권한이 없는 클라이언트에게 서버단에서 해당 리소스를 숨기고 싶을 때
5XX (Server Error)
500 Internal Server Error
- 서버 내부 문제 오류
- 애매한 서버 오류는 모두 500
503 Service Unavailable
- 서비스 이용불가
- 서버 터졌음
- 혹은 서버를 일부러 다운시켜놓은 경우
- Retry-After 헤더 필드로 얼마뒤에 server가 복구될지 알려줄 수 있음
표현
콘텐츠 협상 (Content negotiation)
전송 방식
일반 정보
특별한 정보
인증
쿠키
캐시란
검증 헤더와 조건부 요청 헤더
캐시와 조건부 요청 헤더
프록시 캐시
캐시 무효화
Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache
출처
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard