소프트웨어학 복수전공을 하면서, 개발에 대한 지식이 너무 부족하다고 생각했다. 그래서 부스트캠프에서 백엔드 스터디를 시작하였다. 대학원생도 결론적으로는 모델 서빙을 할 줄 알아야 한다고 생각하기에 개발 공부가 나에게 필수적이라는 생각이 들었다.
http, server, client, 등 기본적인 지식을 인프런에서 2주간 수강하였다. 솔직히 말하자면 2주간 들은 내용으로 당장 서버를 만들고 API를 구성할 수 있는 정도로 많은 것을 알게 되진 않았다. 하지만, Spring, FastAPI 등을 배우는데 앞서 기본을 다진 과정이라고 생각하고 열심히 인강을 듣고 공부했다.
여러 인강이 있지만, 부캠 멘토님이 추천해주신 강의를 들었다.
(전) 우아한 형제들 기술이사셨던 김영한 님의 "모든 개발자를 위한 HTTP 웹 기본 지식" 강의를 들었다. 정말 깔끔하게 정리된 강의 자료와 짧게 구성된 강의는 집중해서 듣기 좋았다.
HTTP, 통신, 캐시, 쿠키, 웹 기본지식에 대한 공부가 필요하신 분들에게 정말 추천하는 강의다.
콘텐츠를 배포하면 안되기에, 공부내용을 간단하게 목차 형식으로만 남기자면,
전송데이터를 TCP세그먼트로 싸고, 그걸 IP패킷으로 싸고 거기에 Ethernet frame을 싸서 LAN 카드를 통해 서버에 전송하는 것이다.
-TCP : 3 way handshake, 패킷 순서 보장, 데이터 전달 보장 => 대부분 TCP 사용 중
-UDP : 기능이 거의 없음, 속도는 TCP보다 빠르지만, 패킷 순서 보장하지 않고, 데이터 전달도 보장하지 못함. 거의 IP 같음...
HTTP = HyperText Transfer Protocol
지금은 Http 시대!
HTTP 메시지에 모든 것을 전송!
Http는 기본이 연결을 유지하지 않는 모델!!
가장 중요한 것은 리소스 식별!!
리소스와 해당 리소스를 대상으로 하는 행위를 분리해서 URI를 구성해야한다.
- GET
: 리소스 조회
- POST
: 요청 데이터 처리, 주로 등록에 사용
- PUT
: 리소스를 대체, 해당 리소스가 없으면 생성
- PATCH
: 리소스 부분 변경
- DELETE
: 리소스 삭제
(+) 기타 메서드
• HEAD
: GET과 동일하지만 메시지 부분을 제외하고, 상태 줄과 헤더만 반환
• OPTIONS
: 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명(주로 CORS에서 사용)
• CONNECT
: 대상 리소스로 식별되는 서버에 대한 터널을 설정
• TRACE
: 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행
사용목적
: GET은 서버의 리소스에서 데이터를 요청할 때, POST는 서버의 리소스를 새로 생성하거나 업데이트할 때 사용 (DB로 따지면 GET은 SELECT 에 가깝고, POST는 Create 에 가깝다고 보면 된다.)
요청에 body 유무
: GET 은 URL 파라미터에 요청하는 데이터를 담아 보내기 때문에 HTTP 메시지에 body가 없음. POST 는 body 에 데이터를 담아 보내기 때문에 당연히 HTTP 메시지에 body가 존재.
멱등성 (idempotent)
: GET 요청은 멱등이며, POST는 멱등이 아니다.
1) 안전 (Safe Method) : 호출해도 리소스를 변경하지 않음
2) 멱등 (Idempotent Methods) : 한번 호출하든 100번 호출하든 결과가 같음
3) 캐시가능 (Cacheable Methods) : 응답 결과 리소스를 캐시해서 사용해도 됨
데이터 전달 방식은 크게 2가지로 볼 수 있는데,
1) 쿼리 파라미터를 통한 데이터 전송
ex) GET
2) 메시지 바디를 통한 데이터 전송
ex) POST, PUT, PATCH
• HTTP API - 컬렉션
• HTTP API - 스토어
• HTML FORM 사용
엔티티(Entity) -> 표현(Representation) 으로 명칭이 바뀌었다
Representation = representation Metadata + Representation Data
표현 = 표현 메타데이터 + 표현 데이터
추후에 REST API속 REST가 Representation 을 의미함.
• Accept: 클라이언트가 선호하는 미디어 타입 전달
• Accept-Charset: 클라이언트가 선호하는 문자 인코딩
• Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
• Accept-Language: 클라이언트가 선호하는 자연 언어
협상 헤더는 요청시에만 사용
• Host: 요청한 호스트 정보(도메인)
• Location: 페이지 리다이렉션
• Allow: 허용 가능한 HTTP 메서드
• Retry-After: 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
1) Authorization: 클라이언트 인증 정보를 서버에 전달
2) WWW-Authenticate: 리소스 접근시 필요한 인증 방법 정의
ex) 로그인 상황에서 쿠키를 사용하지 않으면, 모든 요청에 사용자 정보를 포함해서 로그인 정보를 알려줘야함(http는 stateless 이기에,,) ... 그 대안으로,, 쿠키가 필요함...
❗쿠키 정보는 항상 서버에 전송됨
• 네트워크 트래픽 추가 유발
• 최소한의 정보만 사용(세션 id, 인증 토큰)
• 서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 웹 스토리지 (localStorage, sessionStorage) 참고
❗ 주의 : 보안에 민감한 데이터는 저장하면 안됨(주민번호, 신용카드 번호 등등)
<캐시가 없을 때>
• 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.
• 인터넷 네트워크는 매우 느리고 비싸다.
• 브라우저 로딩 속도가 느리다.
• 느린 사용자 경험
<캐시 적용>
• 캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다.
• 비싼 네트워크 사용량을 줄일 수 있다.
• 브라우저 로딩 속도가 매우 빠르다.
• 빠른 사용자 경험
<캐시 시간 초과>
• 캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신한다.
• 이때 다시 네트워크 다운로드가 발생한다
1) 검증 헤더
2) 조건부 요청 헤더
• Cache-Control: 캐시 제어
• Pragma: 캐시 제어(하위 호환)
• Expires: 캐시 유효 기간(하위 호환)
원서버를 origin이라고 표현하자면, origin server는 리소스 자체가 있는 서버이다.
인터넷 망은 굉장히 복잡한데, 요청을 보내면 여러 서버를 거치게 된다. 미국에 있는 원 서버에서 리소스를 다운받으려먼 시간이 많이 든다. 그렇기에 프록시 캐시 서버(중간 단계 서버)에 리소스를 다운로드 받아두면 사용자는 원 서버 접근보다 빠르게 자료를 받을 수 있다.
ex) 한국에서 미국 유튜브 영상 보면 다운로드 더 오래 걸림...
웹브라우저가 자동으로 cache 생성사는 경우가 있는데, 절대 cache 해서는 안되는 것은 꼭 처리해야함.
1) Cache-Control: no-cache
: 데이터는 캐시해도 되지만, 항상 원 서버에 검증하고 사용(이름에 주의!)
2) Cache-Control: no-store
: 데이터에 민감한 정보가 있으므로 저장하면 안됨
(메모리에서 사용하고 최대한 빨리 삭제)
3) Cache-Control: must-revalidate
: 캐시 만료후 최초 조회시 원 서버에 검증해야함
원 서버 접근 실패시 반드시 오류가 발생해야함 - 504(Gateway Timeout)
must-revalidate는 캐시 유효 시간이라면 캐시를 사용함
🔖 Reference
http 상태 코드 모음 정리 표