(혼자 공부하는 네트워크) 05. 응용 계층
05. 응용 계층 (250p~)
05-1. DNS 와 자원 (252p~)
도메인 네임과 네임 서버
- 도메인 네임(domain name) : 호스트의 IP 주소와 대응되는 문자열 호스트 정보 (example.com)
- 네임 서버(name server) : IP 주소와 도메인 네임을 관리하는 서버 (공용 전화번호부)
- DNS(Domain Name Server) : 도메인 네임을 관리하는 서버
- DNS(Domain Name System) : 분산된 도메인 네임의 관리 체계
- host 파일 : 도메인 네임과 IP 주소의 대응 관계를 담은 파일 (개인 전화번호부)
- mac, linux : /etc/hosts
- windows : \SystemRoot\System32\drivers\etc\hosts
- 전체 주소 도메인 네임(FDQN; Fully-Qualified Domain name) ex. www.example.com.
- 루트 도메인(root domain) : 마지막 .
- 최상위 도메인(TLD; Top-Level Domain) : com
- 2단계 도메인(second-level domain) : example
- 3단계 도메인(호스트 네임. host name) : www
- 서브 도메인 : 자기 앞. example.com 은 com 의 서브 도메인
계층적 네임 서버
- 리졸빙(resolving) : IP 주소를 모르는 상태에서 도메인 네임에 해당하는 IP 를 알아내는 과정(IP 주소 풀이)
- 로컬 네임 서버(local name server) : ISP 가 할당해주는 클라이언트와 닿아 있는 네임 서버
- 공개 DNS 서버(public DNS server) : 로컬 네임 서버 대신 구글의 8.8.8.8 등 이용 가능
- 루트 네임 서버(root name server) : 루트 도메인을 관리하는 네임 서버
- TLD 네임 서버(TLD name server) : TLD 를 관리하는 네임 서버
- 책임 네임 서버(authoritative name server) : 특정 도메인 영역을 관리하는 네임 서버
- 로컷 네임 서버가 마지막으로 질의하는 네임 서버. 곧바로 IP 주소 응답 가능
- 재귀적 질의(recursive query)
- 클라이언트 -> 로컬(공개) -> 루트 -> TLD -> 책임(IP) -> TLD -> 루트 -> 로컬(공개) -> 클라이언트
- 반복적 질의(iterative query)
- 클라이언트 -> 로컬(공개)
- 로컬(공개) -> 루트 -> 로컬(공개)
- 로컬(공개) -> TLD -> 로컬(공개)
- 로컬(공개) -> 책임(IP) -> 로컬(공개)
- 로컬(공개) -> 클라이언트
- DNS 캐시(DNS cache) : 네임 서버들이 응답 결과를 임시 저장했다가 같은 질의에 활용하는 것
- TTL(Time To Live) : 캐시(임시저장)될 수 있는 시간
URI(Uniform Resource Identifier) : 네트워크상에서 자원을 식별하는 방식
- 자원(Resource) : 네트워크상 메시지를 통해 주고받는 대상(내용)
- URL(Uniform Resource Locator) : 위치를 이용해 자원 식별
- ex. foo://www.example.com:8042/over/there?name=gigyesik#eyes
- scheme :
foo://
- 자원에 접근하는 방법(프로토콜)
- HTTP, HTTPS 등
- authority :
www.example.com:8042
- IP 주소 또는 도메인 네임
- 포트 포함
- path :
/over/there
- 자원이 위치하는 경로
- query(query string, query parameter) :
?name=gigyesik
- 서버에 요청을 보낼 때 사용하는 값
- fragment :
#eyes
- 자원의 특정 부분 지칭
- URN(Uniform Resource Name) : 이름을 이용해 자원 식별
- 도서 코드
urn:isbn:045140523
- rfc 문서 번호
urn:ietf:rfc:2648
- 도서 코드
DNS 레코드 타입
- DNS 자원 레코드(DNS resource record) : 도메인 네임과 IP 주소의 대응 관계를 저장하는 값
- 타입
- A : IPv4
- AAAA : IPv6
- CNAME : 호스트 네임의 별칭
- NS : 네임 서버 지정
- MX : 메일 서버
- 이름
- 값
- TTL
- 예시 (타입 / 이름 / 값 / TTL)
- A, example.com, 1.2.3.4, 300 : IPv4 주소 1.2.3.4 와 example.com 대응
- CNAME, www.example.com, example.com, 300 : www.example.com 을 질의해도 1.2.3.4 를 응답받을 수 있음
- 타입
05-3. HTTP (272p~)
HTTP(Hypertext Transfer Protocol) : 응용 계층 프로토콜
- 요청, 응답 기반 (Request, Response Header)
- 미디어 독립적 : 자원의 특성과 무관
- 자원(resource) : HTTP 가 요청하는 대상
- 미디어 타입(media type), MIME 타입(Multipurpose Internet Mail Extensions Type) : 메시지로 주고받는 자원의 종류
type/subtype;parameter=value
ex. application/json, text/html;charset=UTF-8, */*- 타입(type) : 데이터의 유형
- 서브타입(subtype) : 타입의 세부 유형
- parameter, value : 부사적인 설명
- 상태를 유지하지 않음(스테이트리스; stateless) : 서버는 HTTP 요청을 보낸 클라이언트의 상태를 기억하지 않음
- 확장성(scalability) : 언제든 요철할 서버를 추가할 수 있음
- 견고성(robustness) : 서버 중 하나에 문제가 생겨도 다른 서버로 대체 가능
- 지속 연결(persistent connection)
- HTTP 1.1 이상에서 지원
- keep-alive. 즉 하나의 TCP 연결로 여러 개의 요청, 응답을 주고받을 수 있음
HTTP 메시지 구조
- 시작 라인(start-line)
- 요청 라인(request-line) : HTTP 요청 메시지인 경우
메서드 (공백) 요청 대상 (공백) HTTP 버전 (줄바꿈)
- 메서드(method) : 작업의 종류. GET, POST, PUT, DELETE 등
- 요청 대상(request-target) : 요청을 보낼 서버의 자원. 쿼리가 포함된 URI 경로
- HTTP 버전(HTTP-version) : 사용된 HTTP 버전. HTTP/<버전> 형식버전>
- 상태 라인 : HTTP 응답 메시지인 경우
HTTP 버전 (공백) 상태 코드 (공백) 이유 구문(선택적) (줄바꿈)
- 상태 코드(status code) : 요청 결과를 나타내는 세 자리 정수
- 이유 구문(reason phrase) : 상태 코드에 대한 문자열 형태의 설명
- 요청 라인(request-line) : HTTP 요청 메시지인 경우
- 필드 라인, 헤더 라인
- HTTP 헤더(HTTP header) :
헤더 이름(header-name):헤더 값(header-value)
- HTTP 통신에 필요한 부가 정보
- HTTP 헤더(HTTP header) :
- 메시지 본문(message-body)
HTTP 메서드
- GET : 특정 자원 조회
- 요청 : 요청 대상 + Host 헤더
- 응답 : 요청한 자원
- 요청에 메시지 본문(message-body) 미포함
- HEAD : GET 메서드와 동일하나, 응답에 메시지 본문 없음
- POST : 서버에 작업 요청
- 서버에 새로운 자원을 생성하는 경우
- 응답에 Location 헤더 포함(생성된 자원의 위치)
- PUT : 요청 자원이 없다면 메시지 본문으로 새롭게 생성, 있으면 메시지 본문으로 대체
- PATCH : 부분적 수정
- DELETE : 특정 자원 삭제
- API 문서 : URL 요청에 대한 서버의 응답 문서
HTTP 상태 코드 (응답 메시지)
- 200번대 : 성공 상태 코드
- 200 OK : 요청 성공
- 201 Created : 요청 성공, 새로운 자원 생성
- 202 Accepted : 요청 수신 완료, 요청 작업 미완료 (요청 결과 곧바로 응답하지 못하는 상황)
- 204 No Content : 요청 성공, 메시지 본문으로 표시할 데이터 없음
- 300번대 : 리다이렉션(redirection)
- 리다이렉션 : 클라이언트의 요청을 다른 곳(URL 또는 캐시)으로 이동시키는 것
- 영구적 리다이렉션(permanent redirection) : 자원 완전 이동, 경로 재지정
- 일시적 리다이렉션(temporary redirection) : 자원 위치 임시 변경 또는 임시 사용 URL 이 필요한 경우
- 301 Moved Permanently : 영구적 리다이렉션. 메서드 변경될 수 있음
- 308 Permanent Redirect : 영구적 리다이렉션. 메서드 변경되지 않음(301보다 명시적)
- 302 Found : 일시적 리다이렉션. 메서드 변경될 수 있음
- 303 See Other : 일시적 리다이렉션. 메서드 GET 으로 변경
- 307 Temporary Redirect : 일시적 리다이렉션. 메서드 변경되지 않음(302보다 명시적)
- 리다이렉션 : 클라이언트의 요청을 다른 곳(URL 또는 캐시)으로 이동시키는 것
- 400번대 : 클라이언트 에러
- 400 Bad Request : 클라이언트의 요청이 잘못된 경우
- 401 Unauthorized : 요청한 자원에 대한 유효한 인증이 없음
- 403 Forbidden : 요청이 서버에 의해 거부됨(접근 권한이 없는 경우. 인가)
- 인증(authentication) : 자신이 누구인지 증명하는 것
- 인가(authorization) : 인증된 주체에 작업을 허용하는 것(권한 부여)
- 404 Not Found : 요청 자원을 찾을 수 없음
- 405 Method Not Allowed : 요청 메서드를 지원하지 않음
- 500번대 : 서버 에러
- 500 Internal Server Error : 요청을 처리할 수 없음
- 502 Bad Gateway : 중간 서버의 통신 오류
- 503 Service Unavailable : 현재 요청 처리 불가능. 추후 사용 가능할 수도 있음
HTTP 의 역사
- HTTP/0.9
- GET 만 사용 가능
- 요청 메시지 한 줄
- HTTP/1.0
- HEAD, POST 도입
- 헤더 지원 시작
- 지속 연결(persistent connection) 미지원 : 요청 때마다 연결 새로 생성
- HTTP/1.1
- 지속 연결 공식 지원
- 파이프라이닝 지원(응답 수신 전 다음 요청 보내기 가능)
- 콘텐츠 협상 기능
- HTTP/2.0
- 헤더 압축 전송
- 바이너리 데이터 기반(이전 버전은 텍스트 기반)
- 서버 푸시(server push) : 클라이언트가 요청하지 않더라도 자원을 미리 전송
- HOL 블로킹(Head-Of-Line blocking) 완화
- HOL 블로킹 : 같은 큐에서 첫 번째 패킷의 처리 지연으로 나머지 패킷도 모두 지연되는 문제
- 멀티플렉싱(multiplexing) : 스트림(stream)을 이용해 데이터 병렬 전송
- HTTP/3.0
- UDP 기반 구현된 QUIC(Quick UDP Internet Connection) 프르토콜 기반으로 동작(빠름)
05-3. HTTP 헤더와 HTTP 기반 기술 (308p~)
HTTP 헤더
- 요청 시 활용되는 HTTP 헤더
- Host : 요청을 보낼 호스트
- 도메인 이름 (+ 포트)
- ex. Host: example.com:1234
- User-Agent : HTTP 요청을 시작하는 클라이언트 측 프로그램
- (브라우저 Mozilla 호환 여부)(운영체제 및 아키텍처 정보)(렌더링 엔진 관련 전보)(브라우저와 버전 정보)
- ex. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0
- Referer : 클라이언트가 요청을 보낼 때 머무르고 있던 URL
- 원래 Referrer 가 맞지만, 초기 개발 당시 오타 그대로 사용
- ex. Referer: https://example.com
- Authorization : 클라이언트의 인증 정보
- Authorization :
(인증 타입) (인증을 위한 정보) - 인코딩(encoding) : 문자를 코드로 변환하는 방법. ex. Base64 (Basic 인증에서 사용)
- ex. Authorization: Basic bWluY2h1bDoxMjM0
- Authorization :
- Host : 요청을 보낼 호스트
- 응답 시 활용되는 HTTP 헤더
- Server : 서버 측의 소프트웨어 관련 정보
- ex. Server: Apache/2.4.1 (Unix)
- Allow : 허용된 HTTP 메서드 목록
- HTTP 상태 코드 405(Method Not Allowed)를 응답하는 경우 사용
- ex. Allow: POST, OPTIONS
- Retry-After : 자원을 사용할 수 있는 날짜 또는 시각
- HTTP 상태 코드 503(Service Unavailable)을 응답하는 경우 사용
- ex. Retry-After: Fri, 23 Aug 2024 09:00:00 GMT
- ex. Retry-After: 120
- Location : 클라이언트에게 자원의 위치를 알려주기 위해 사용
- 리다이렉션 또는 새로운 자원 생성시
- WWW-Authenticate : 자원에 접근하기 위한 인증 방식
- HTTP 상태 코드 401(Unauthorized)을 응답하는 경우 사용
- ex. WWW-Authenticate: Basic
- ex. WWW-Authenticate: Basic realm=”Access to personal info”, charset=”UTF-8”
- 영역(realm) : 보안이 적용된 영역. 영역에 따라 요구되는 권한이 다를 수 있음
- Server : 서버 측의 소프트웨어 관련 정보
- 요청과 응답 모두에서 활용되는 HTTP 헤더
- Date : 메시지가 생성된 날짜와 시각
- ex. Date: Tue, 15 Nov 1994 08:12:31 GMT
- Connection : 클라이언트의 요청과 응답 간의 연결 방식
- HTTP 는 지속 연결 프로토콜(keep alive)
- ex. Connection: keep-alive
- ex. Connection: close
- Content-Length : 본문의 바이트 단위 크기(길이)
- ex. Content-Length: 100
- 표현 헤더(representation header)
- Content-Type : 메시지 본문에서 사용될 미디어 타입
- ex. Content-Type: text/html; charset=UTF-8
- Content-Language : 메시지 본문에 사용될 자연어
Content-Language: (서브 태그)-(서브 태그)-..
- ex. Content-Language: ko
- ex. Content-Language: en-US
- Content-Encoding : 메시지 본문을 압축하거나 변환한 방식
- ex. Content-Encoding: gzip
- ex. Content-Encoding: deflate, gzip
- Content-Type : 메시지 본문에서 사용될 미디어 타입
- Date : 메시지가 생성된 날짜와 시각
캐시(cache) : 불필요한 대역폭 낭비와 응답 지연을 방지하기 위해 정보의 사본을 임시로 저장하는 기술
- 개인 전용 캐시(private cache) : 웹 브라우저에 저장된 캐시
- 공용 캐시(public cache) : 중간 서버에 저장된 캐시
- 캐시 신선도(cache freshness) : 캐시된 사본 데이터와 최신 원본 데이터의 유사도
- 캐시 데이터에 유효 기간 부여
- Expires 헤더
- ex. Expires: Tue, 06 Feb 2024 12:00:00 GMT
- Cache-Control 헤더의 Max-Age 값(초)
- ex. Cache-Control: max-age=1200
- Expires 헤더
- 캐시의 신선도 검사
- 날짜 기반
- If-Modified-Since (이 날짜 이후로 자원 변경이 변경되었는지)
- ex. If-Modified-Since: Fri, 23 Aug 2024 09:00:00 GMT
- 서버 응답
- 자원 변경 있음 : 200(OK) + 새로운 자원
- 자원 변경 없음 : 304(Not Modified) -> 클라이언트는 캐시 사용
- Last-Modified(선택) : 자원의 마지막 변경 시점
- 자원 삭제 : 404(Not Found)
- If-Modified-Since (이 날짜 이후로 자원 변경이 변경되었는지)
- 엔티티 태그 기반
- 엔티티 태그(entity tag, ETag) : 자원의 버전을 식별하기 위한 정보
- 버전(version) : 유의미한 변경 사항
- If-None-Match (ETag 값과 일치하는 지원이 있는지)
- ex. If-None-Match: “abc”
- 서버 응답
- ETag 값 변경(자원 변경 있음) : 200(OK) + 새로운 자원
- ETag 값 동일(자원 변경 없음) : 304(Not Modified)
- 자원 삭제 : 404(Not Found)
- 날짜 기반
- 캐시 데이터에 유효 기간 부여
쿠키(cookie) : 서버에서 생성되어 클라이언트 측에 저장되는 데이터
- HTTP 의 stateless 성격을 보완
- 세션 인증
- 세션 아이디(session id) : 쿠키를 통해 전달
- 클라이언트 -> 서버 : 인증 정보 전송
- 서버 -> 클라이언트 : 세션 아이디 전송
- 서버 : 세션 아이디 저장(DB 등)
- 클라이언트 -> 서버 : 쿠키 내부의 세션 아이디 포함하여 요청
- 서버 : 요청받은 세션 아이디와 저장된 세션 아이디를 비교하여 클라이언트 식별
- Set-Cookie : 응답 메시지 헤더. 쿠키에 저장된 값 전달
Set-Cookie: 이름=값; 속성; ..
- ex. Set-Cookie: message=hello
- 속성
- domain : 쿠키가 사용될 도메인
- path : 쿠키가 사용될 경로(하위 경로)
- Expires, Max-Age : 쿠키의 유효 기간
- Cookie : 요청 메시지 헤더. 서버에 전달할 쿠키
Cookie: 이름=값; 이름=값; ..
- ex. Cookie: name=gigyesik, message=hello
- 쿠키의 한계 : 쉽게 노출되거나 조작될 수 있음(보안)
- 보완 속성
- Secure : HTTPS 프로토콜이 사용되는 경우에만 쿠키 전송
- HttpOnly : 자바스크립트에서 쿠키에 접근 불허용 (HTTP 헤더를 통해서만 가능)
- 보완 속성
웹 스토리지(web storage) : 쿠키 이외의 웹 브라우저 내 저장 공간
- 쿠키와 달리 서버로 자동 전송되지 않음
- 로컬 스토리지(local storage) : 영구 저장 가능(별도로 삭제하지 않으면)
- 세션 스토리지(session storage) : 세션이 유지되는 동안 저장(브라우저가 열려 있는 동안)
콘텐츠 협상과 표현
- 콘텐츠 협상(content negotiation) : 같은 URI 에 대해 가장 적합한 자원의 형태를 제공하는 메커니즘
- 표현(representation) : 송수신 가능한 자원의 형태
- GET 메서드 재정의 : 자원 습득 -> 자원의 특정 표현 습득
- 요청 메시지 헤더
- Accept : 선호 미디어 타입
- Accept-Language : 선호 언어
- Accept-Charset : 선호 문자 인코딩
- Accept-Encoding : 선호 압축 방식
- 우선순위 : 헤더의 q값. 생략된 경우 1, 범위 0~1, 클수록 우선순위 높음
- ex. Accept: text/html, application/xml; q=0.9, text/plain; q=0.6, */*; q=0.5
- ex. Accept-Language: ko-KR, ko; q=0.9, en-US; q= 0.8, en; q=0.7
This post is licensed under CC BY 4.0 by the author.