HTTP-WEB
Web : HTML이라는 문서 형태와 HTTP라는 문서 전송 프로토콜, URL로 문서의 위치를 표시하는 시스템
HTTP (Hypertext Transfer Protocol)
- 웹에서 데이터를 주고받는 방식 (Server - Client 모델)
- 클라이언트와 서버 사이에서 클라이언트가 메시지(요청, Request)를 주고, 서버가 메시지를 받아서 응답(Response)을 주는 형태의 통신 방법
URI(Uniform Resource Identifier)
- Uniform: 리소스 식별하는 통일된 방식
- Resource: 자원, URI로 식별할 수 있는 모든 것(제한 없음)
- Identifier: 다른 항목과 구분하는데 필요한 정보
HTML (Hyper Text Markup Language)
- 하이퍼미디어 포맷
- XML을 바탕으로 한 범용 문서 포맷
- 이를 이용하여 사용자가 알아보기 쉬운 형태로 표현
브라우저가 웹 페이지를 보여주는 과정
- 브라우저 주소창에 naver.com을 입력한다
- 브라우저가 DNS 를 통해 naver.com의 IP를 확인한다
- 브라우저는 서버에게 HTTP GET Request 를 보낸다
- 서버가 html을 만들어 브라우저에게 HTTP Response 를 보낸다
- 브라우저는 받은 html을 읽으며 렌더링 한다
- 이 과정에서 html 내의 html, css ,js, image 등의 자원 링크를 발견하면 자원에 대한 HTTP GET Request를 재귀적으로 보낸다
도메인에 해당하는 IP를 찾는 과정
- OS의 hosts 파일 탐색 - DNS Client 탐색
- 만약 hosts 파일에 해당 도메인이 존재하지 않으면, 차근차근 상위 DNS Server에 해당 도메인을 요청한다.
MVC(Model View Controller)
- 초기 웹 개발
- PHP, JSP, ASP 같은 서버 측 스크립트 언어
- HTML + 프로그래밍 언어가 혼재
- 규모가 커질수록 복잡도가 급격히 증가하여 유지보수 어려움
- PHP, JSP, ASP 같은 서버 측 스크립트 언어
MVC
- Model
- 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
- 뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 한다.
- 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 한다.
- View
- 모델이 가지고 있는 정보를 따로 저장해서는 안된다.
- 모델이나 컨트롤러와 같이 다른 구성요소들을 몰라야 된다.
- 변경이 일어나면 변경통지에 대한 처리방법을 구현해야만 한다.
- Controller
- 모델이나 뷰에 대해서 알고 있어야 한다.
- 모델이나 뷰의 변경을 모니터링 해야 한다.
- 사용자의 입력값을 검증해야 한다.
- MVC Framework
- MVC 기반 구조를 직접 구현 -> 생산성 저하
- boilerplate code 를 줄이기 위해 등장
- MVC 프레임워크의 종류
- Spring
- 장고
- Nest.js
- Express.js
HTTP-Network
HTTP
- HTTP/2.0 까지는 TCP, HTTP/3.0은 UDP 기반의 QUIC 사용
- 기본 포트
- HTTP: 80
- HTTPS: 443
HTTP 참여자
- Client: 서버에 컨텐츠를 요청
- Server: 클라이언트의 요청에 대한 응답
- Proxy: 클라이언트와 서버 사이에 존재.
- 오가는 데이터에 대해 캐싱, 필터링, 로드 밸린싱, 인증, 로깅 등 기능 제공
HTTP 특징
- 간단하다
- 상태가 없다. 매 요청은 새로운 요청이다.
- 인증을 위해 추가적인 정보 필요
- Authentication Header
- Cookie - Session
- 인증을 위해 추가적인 정보 필요
DNS 동작 원리
Query Process Type
- Iterative Query
- Header RD bit: 0
- 응답으로 또 다른 DNS의 IP 알려줌
- 해당 IP에 새로운 DNS Query를 날리는 과정을 반복
- 응답으로 도메인의 IP를 받으면 멈춤
- 해당 IP에 새로운 DNS Query를 날리는 과정을 반복
- Recursive Query
- Header RD bit: 1
- 응답으로 도메인의 IP를 알려줌
- DNS 서버가 내부적으로 Iterative Query를 수행함.
DNS Server Type
- Local DNS
- PC 가 직접 통신하게 되는 DNS 서버
- 주로 통신사 기지국 DNS
- PC를 대신해 iterative query 수행
- Root DNS
- ICANN이 직접 관리
- TLS DNS 서버 IP를 저장해두고 안내
- Top-Level DNS
- 도메인 네임 마지막 segment 를 담당하는 서버 ex) .com
- Authoritative DNS 서버 IP를 저장해두고 안내
- Authoritative DNS
- 실제 개인 도메인과 IP 주소의 관계가 저장되어 있는 서버
PC가 DNS 를 통해 www.naver.com IP를 얻는 과정
- PC의 DNS 캐시에 www.naver.com IP가 있는지 확인한다.
- 없다면 Local DNS 서버에 www.naver.com에 대한 Recursive Query를 보낸다.
- Local DNS 서버는 캐시에 www.naver.com IP가 있는지 확인한다
- 없다면 Root DNS에 www.naver.com에 대한 Iterative Query를 보낸다.
- 응답으로 .com Top-Level DNS IP를 받는다
- .com Top-Level DNS에 www.naver.com에 대한 Iterative Query를 보낸다.
- 응답으로 naver.com Authoritative DNS IP를 받는다
- naver.com Authoritative DNS에 www.naver.com에 대한 Iterative Query를 보낸다.
- 응답으로 www.naver.com에 대한 IP를 받는다.
- 서버의 캐시에 www.naver.com 의 IP를 저장한다
- PC에게 www.naver.com 의 IP를 보낸다
HTTP 메소드
- GET
- 데이터를 조회를 요청하는 메소드
- 멱등성을 보장해야 한다.
- 리턴값이 캐시 가능하다.
- POST
- 데이터의 처리를 요청하는 메소드
- 타깃 리소스의 정의대로 처리된다.
- 클라이언트가 요청하면, 서버에서 모든 걸 알아서 처리하도록 한다.
- 멱등성을 보장하지 않아도 된다.
- 리턴 값이 캐시 가능하지만, Body까지 캐시 키로 고려해야 해서 잘 쓰이지 않는다.
- PUT
- 데이터의 덮어쓰기를 요청하는 메소드
- 클라이언트가 서버 내 파일의 위치를 알고있어야 한다.
- 리소스 전체를 업데이트한다.
- 멱등성을 보장해야 한다.
- PATCH
- 데이터의 부분 업데이트를 요청한다.
- 클라이언트가 서버 내 파일의 위치를 알고있어야 한다.
- 멱등성을 보장하지 않아도 된다.
- 리턴 값이 캐시 가능하지만, Body까지 캐시 키로 고려해야 해서 잘 쓰이지 않는다.
- DELETE
- 데이터의 삭제를 요청한다.
- 멱등성을 보장해야 한다.
- “리스트의 마지막 데이터를 삭제해줘”같은 메소드가 있으면 안된다.
참고: 캐시 가능 여부
- 클라이언트가 요청 시, 서버에 바로 요청을 보내지 않고, 내부에 저장된 캐시 메모리를 이용할 수 있는지 여부
- 주의: 서버가 서버 내부에서 캐싱하는 걸 의미하는 게 아님.
참고 2: 멱등성
- 메소드 f에 대하여 f(f(x)) = f(x) 인 성질
- 자신이 아닌 다른 메소드에 의해 결과가 달라지는 것은 고려하지 않는다.
웹 폼을 이용한 대용량 파일 전송의 동작 방식은 어떻게 될까?
- 파일 업로드에서 이미지와 이미지에 대한 설명을 한번에 전송한다고 가정.
- 이때 HTTP Request body에 두 종류에 데이터가 들어가야 한다.
- 데이터의 content type이 image/jpeg, text/html로 다르기 때문에 사용하는 것이 multipart
multipart의 사용 구조
- header에서 content-type을 multipart로 설정
- Content-Type: multipart/form-data ; boundary=바운더리로 사용할 문자열
- boundary: body에 여러 데이터를 담아야 하기 때문에 구분을 위해 사용하는 문자열
- body의 시작과 끝, 데이터 사이에 boundary로 지정한 문자열 사용
- body에 각 데이터에 대한 정보로는 Content-Disposition, Content-Type 등이 들어갈 수 있음
- Content-Disposition: form-data; name="image1"
- Content-Type: image/jpeg
- 참고 - Content-Disposition
- 일반적 HTTP Response: 웹 페이지에 inline 되는 데이터인지 or 다운로드 받아야하는 attachment 데이터인지
- multipart/form-data: 현재 필드에 대한 정보
Cookie와 Session
상태성 vs 무상태성
- HTTP는 기본적으로 상태를 갖지 않는다.
- 어느 서버에서 요청을 처리하든지 동일하게 처리할 수 있도록.
- 특수하게 WebSocket이라는 기술을 활용해 상태도 지원하긴 한다.
- 클라이언트를 구분할 방법이 필요하다.
쿠키
- 서버에서 클라이언트를 구분하기 위한 방법으로 사용하기 위한 헤더.
- 클라이언트가 자신의 정보를 “쿠키”라는 헤더에 담아 보내도록 만든다.
- 서버는 클라이언트가 전송한 Cookie 헤더 값에 따라 해당 사용자가 누군지를 확인한다.
세션
- 세션 방식
- 쿠키에 사용자의 중요 정보들을 담으면, 유출의 가능성이 있다.
- 사용자의 중요 정보는 내부 DB에 저장하고, 서버는 의미를 갖지 않는 UUID와 같은 값들을 사용해서 사용자를 식별한다.
- 세션
- 위에서 이야기한 “내부 저장소”를 세션이라고 한다.
- 서버는 클라이언트가 전송한 쿠키 내 Session Id를 활용해 서버에 저장된 값을 꺼내와 사용한다.
주요 헤더
- Secure
- HTTPS 요청에만 쿠키를 담아서 보내도록 하는 헤더
- Http-Only
- XSS 공격 방지
- 자바스크립트로 쿠키에 접근하지 못하도록 하는 헤더.
- Same-Site
- CSRF 공격을 막기 위한 헤더.
- 요청한 도메인과 쿠키에 설정된 도메인이 같은 경우에만 해당 쿠키 전송
'CS > 네트워크 - Top-down Approach + @' 카테고리의 다른 글
[네트워크] 소켓 통신의 기본 (0) | 2024.11.13 |
---|---|
쿠키, XSS, CSRF, SOP, CORS (0) | 2024.09.27 |