Study/CS 기초

네트워크 - 응용 계층

김 도경 2024. 10. 22. 20:44

[2024.10.22] 필수 온라인 강의 Part3 네트워크 CH05 응용 계층

DNS

(***기술면접 빈출!!!***)

  • 네트워크 상에서 호스트를 특정 지을 수 있는 주소
      - MAC 주소 : 사람을 식별하는 고유한 주민등록번호
      - IP 주소  : 주소 : 모든 IP/MAC 주소를 알고 있기란 어렵다 -> DNS를 이용
        + IP 주소는 언제든 변경될 수 있다 / 임의로 지정이 가능하다.

  • DNS
      - 전화번호부(개인소유, 공용)와 유사한 기능을 수행!
      - 개인 소유 / 공용 모두 가능하다. 
      - 사람이 기억하기 쉬운 도메인 이름과 호스트를 특정지을 주소를 매핑
                 * 도메인: 호스트에 부여되는 문자열 이름 (e.g. google.co.kr)

    - hosts 파일 – 개인 전화번호부 : 모든 전화번호를 관리하기 어렵다

  • DNS 서버는 계층적 도메인 구조를 띄고있다.
       - 가장 위에 있는 도메인 서버 : root 도메인 서버
    - root
          - 가장 위에 있는 도메인 서버 : 전세계 10개정도 존재
          - 루트 네임 서버
    - TLD (Top-Level-Domain) : 원래 최상위 도메인 서버
           ( .com, .org, .net , .int , .edu, .gov, .mil 등)
    - Second Level Domain    : co, ac
    - Third Level Domain : google , naver 등등
    - Forth Level Domain : www, api, blog 등등

  • 서브 도메인 (하위 도메인)
    - 도메인의 일부인 도메인
             - naver.com -> maps.naver.com
             - wikipedia.com -> en.wikipedia.com / ko .wikipedia.com

  • 각 도메인을 담당하는 도메인 서버
    - ROOT 네임 서버
    - TLD 서버
    - Authoritative DNS 서버: 찾고자 하는 도메인의 IP주소를 저장하는 최종 서버
    - local DNS 서버: 클라이언트가 가장 먼저 찾는 DNS 서버 (DNS Resolver)

  • local DNS 서버(클라이언트가 가장 먼저 찾는 서버) 주소 명시적 설정 <- Public DNS
        - Google의 DNS 서버 : https://developers.google.com/speed/public-dns?hl=ko
    local DNS 서버 주소 자동 설정 <- ISP

  • 질의 
    - 반복적 질의
       - local DNS 서버에서 root DNS 서버에 묻고, 다시 TLD에 묻고, 다시 다음 서버에 묻고, 그럼 최종적으로 얻을 수 있음
       - 반복적으로 계속 질문하는 것 
    - 재귀적 질의
       - root DNS 서버에 묻고 응답받고, root가 TLD에게 묻고 계속가서 원하는 서버가 도달할때까지 물어서 최종으로 가져다줌

  • DNS 레코드 (자원 레코드)
     - DNS 서버에 저장하고 있는 것

    - DNS 레코드 타입
          - A 레코드: 도메인에 대한 IPv4 주소
          - AAAA 레코드: 도메인에 대한 IPv6 주소
          - CNAME 레코드: 도메인에 대한 별칭
          - NS 레코드: 네임 서버 주소
          - SOA 레코드: 도메인에 대한 관리자 정보

  • DNS 캐시 : TTL 기간동안 DNS 저장

 

자원과 자원의 식별
  • 네트워크 상에서의 ‘자원’
          - 네트워크로 주고받을 수 있는 모든 정보
          - 파일, 이미지, 동영상, HTML, XML, JSON, ...

  • 네트워크 상에서의 ‘자원’이 필요하다면 자원을 요청해야 함         : 일상적으로 이루어지는 일
          - 자원을 요청하고 요청한 자원을 응답하려면 자원을 식별(identify)할 수 있어야
              == 자원의 식별자(identifier)가 있어야

  • 자원의 식별자 == URI (Uniform Resource Identifier)
    URI는 자원을 식별할 수 있는 문자열

    - URI의 분류
          - URI는 위치 혹은 이름으로 분류 가능하다
          - URL: 위치 기반 자원 식별(Locator)
          - URN: 이름 기반 자원 식별(Name)

    - URL 구성 요소
          - scheme
               - 일반적으로 프로토콜 이름 명시 : https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
               - (예시) ftp://ftp.kernel.org/ ,  https://example.com/
          - authority = [ userinfo "@" ] host [ ":" port ]
               - 사용자 이름을 이용한 인증 가능 – 생략 가능
               - 호스트 이름 (도메인 이름 혹은 IP 주소)
               - 포트 번호 – 생략 가능
          - path
               - 자원이 있는 경로
          - query
               - key:value형태로 서버에 전달할 문자 형태의 파라미터
               - ?로 시작, & (혹은 ;)로 다수의 query 구분
          - fragment
                - 자원의 조각(fragment)를 가리키는 데에 사용 (#로 구분)
                - 예를 들면 북마크 / 서버에 전달되는 정보는 아님

    예시 ) https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top
          - scheme = http
          - authority = www.example.com:123
          - path = /forum/questions/
          - query = ?tag=networking&order=newest
          - fragment = #top

  • 브라우저 창에서 URL, Scheme 확인이 가능하다.
웹 서버와 웹 어플리케이션 서버
  • 서버(server)-클라이언트(client)의 개념
          - 서버는 대답하는 대상(response)
          - 클라이언트는 요청하는 대상(request)

  • 서버가 응답해야 하는 자원
          - 정적인 자원 : 언제/어디서/누가 봐도 변하지 않는 정보 (e.g. HTML, 이미지, 동영상, ...)
          - 동적인 자원 : 언제/어디서/누가 보는지에 따라 변할 수 있는 정보 (매일의 기온, 아이디에 따른 이름)
                                  -> 여기서 주로 사용되는 것이 데이터베이스
  • 웹과 관련된 서버
          - 웹 서버                                    - 정적인 자원에 응답
                 -NGINX , APACHE, Microsoft IIS, 
          - 웹 어플리케이션 서버 (WAS)    - 동적인 자원에 응답
                  - Apache Tomcat, JBoss, IBM webSphere
    - 둘의 차이는 응답해야하는 자원의 차이

    - 웹 서비스에 웹서버와 웹 어플리케이션 서버를 동시에 한다.
         : 동적인 자원은 웹서버, 동적인 자료만 웹 어플리케이션의 서버에 해서 과도한 부하 방지
      - 웹 서버에서 보안을 하면 웹 어플리케이션 서버도 안전 : 보안상의 이점
      - 여러 웹 어플리케이션 서버 연동 용이(확장성 유리) : 여러 웹 어플리케이션과 웹 서버가 연동 가능하다.
HTTP
  • 현재 HTTP의 기본 특성  (***반드시 기억하기***)
    - 요청-응답 기반 클라이언트-서버 구조 프로토콜
            - HTTP 클라이언트 (HTTP 요청 메세지)
            - HTTP 서버 (HTTP 응답 메세지)
               * 오해 방지: 서버 간에도 HTTP 메세지(모든종류의 메세지를 주고 받을 수 있음)를 주고받을 수 있음

    - 미디어-독립적 프로토콜
            - 어떤 형태의 데이터HTTP 메세지로 보낼 수 있음 ( HTML, 이미지, JSON, XML, 파일, 영상, 이미지 등 )

    - 비연결성 프로토콜
             - HTTP 1.0, HTTP 1.1, HTTP 2.0은 TCP 기반
              - 연결성 프로토콜이라면 다수의 클라이언트가 연결을 시도할 경우
                        : 연결을 유지하는 동안 서버의 자원 소모가 너무 크다!
             - TCP는 연결성 프로토콜 But, HTTP는 비연결성 프로토콜 

    - 스테이트리스 프로토콜
          - 서버는 클라이언트의 상태를 기억하지 않는다
          - 클라이언트는 한 서버에 종속될 필요가 없어짐
          - 여러 번 요청을 보내야 할 경우 여러 서버에 요청할 수 있음 서버의 확장이 용이해진다
          - 왜 스테이트리스 프로토콜일까?
             (만일 스테이트풀 프로토콜이면 : 클라이언트는 한 서버에 종속/ 여러 요청을 보내야 할 경우 한 서버에만 요청해야 함
                    -> 서버의 IP가 바뀐다면? 요청을 보낸 서버에 장애가 생긴다면? 서버가 여러 대 있다면? 통신이 불가능해짐)

    - 지속 연결 프로토콜
          - 하나의 연결을 사용해 여러 개의 HTTP 요청/응답 주고받기
         (만일 연결할 때마다 3-way handshake를 하면, 혼잡 증가, 시간 지연 증가(handshake, slow start 시간))

  • HTTP 버전별 특성      : 지금까지 지속적으로 개발이 되기에 여러 버전이 있음
          - HTTP 0.9: 단일한 요청 방법(GET 메서드), 비지속 연결, 별다른 기능 X
          - HTTP 1.0: 다양한 요청 방법과 헤더 추가
          - HTTP 1.1: 지속 연결 기능 추가
          - HTTP 2.0: 요청 순서대로 응답을 반환할 필요 없음, 헤더 압축
          - HTTP 3.0: UDP 기반 프로토콜인 QUIC로 변경
  • HTTP 메세지
  • HTTP 요청 헤더 – Start line  
      - HTTP 메서드 (공백) /요청 대상 (공백) HTTP /버전 (개행)
       - 여기서 GET이 메서드, restapi이 요청대상, 버전은 1.1
       - HTTP 메서드 (***반드시 기억하기***)
             - GET : 자원 조회 (”갖다 줘”)
                        - 리소스 조회에 사용
                        - 일반적으로 쿼리(&) 문자열을 사용하되, 본문은 없음
             - POST : 요청할 데이터 처리 (“이 데이터 처리해 줘”)
                       -  메세지 본문으로 처리할 데이터
                       - 메세지 본문에 해당하는 데이터 처리하도록 요청
                       - 어떻게 처리할지는 서버가 결정 (e.g. 새 자원 생성, 가공)
             - PUT : 자원 덮어쓰기 ( “이 자원으로 대체해줘”)
                       - 자원이 있다면 본문으로 보낸 데이터로 대체
                       - 자원이 없다면 본문으로 보낸 데이터로 생성
             - PATCH : 자원 부분 변경
             - DELETE : 자원 삭제
                  * 이외에도 HEAD, OPTIONS, TRACE, CONNECT
     - HTTP 메서드 : https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
                - 멱등성: 여러 번 동일한 요청을 보내도 첫 요청 결과와 같은가
                - 캐시(응답결과를 조금 저장해놓은것) 가능성: 응답 결과를 캐시해서 사용할 수 있는가

  • 요청 대상 : 요청할 자원의 위치

  • HTTP 버전 : HTTP 1.1, HTTP 2.0

  • HTTP 응답 헤더 – Start line
      - HTTP 버전 (공백) 응답 코드 (공백) 이유 문구 (개행)
    - 응답 코드
          - 2XX: 성공
                   - 200 OK: 요청 성공 (GET)
                   - 201 Created: 요청 성공, 새로운 자원 생성됨 (POST)
                   - 202 Accepted: 요청 성공, 처리는 아직 미완료
                   - 204 No Content: 요청 성공, 응답할 데이터 없음
          - 3XX: 리다이렉션 
                   - 응답의 Location 헤더를 통해 특정 위치로 이동
                   - 이 요청을 처리하려면 추가적인 처리가 필요
          - 4XX: 클라이언트 오류  : 니 책임이야! 라는 말!
                 - 401 Unauthorized: 미인증
                 - 403 Forbidden: 금지된 자원에 접근 (자원에 접근할 권한이 없음)
                 - 404 Not Found: 요청한 자원 없음 (공개한 자원이 아님)
          - 5XX: 서버 오류    : 내 책임이다.
                 - 500 Internal Server Error: 서버 오류
                 - 503 Service Unavailable: 현재 이용 가능하지 않음

  • HTTP 헤더
    - 다양한 요청 헤더 필드 : https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Standard_request_fields
    - 다양한 응답 헤더 필드 : https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Standard_response_fields

    - HTTP 헤더 표기
       - header-field = field name ":" field-value 
       - 메세지 전송에 필요한 부가 정보

    - 대표적인 헤더 정보
       - Host: 요청 호스트에 대한 호스트명 + 포트 정보
       - Date: 메세지 생성 시간
       - Referer: 직전에 머물렀던 URL
       - User-Agent: 클라이언트가 사용한 소프트웨어 및 브라우저 명칭과 정보
                 - 특정상황에 디버깅할 때, 특정상황을 알아낼 수 있음
                 - 참고자료 : https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
       - Server: 서버 소프트웨어 명칭과 정보
       - Connection: keep-alive일 경우 킵 얼라이브
       - Location: 리다이렉트시 이동할 경로
       - Content-Type: HTTP 요청 및 응답에서 사용될 컨텐츠의 유형
                 - MIME 타입으로 명시
                 - 웹 상에서 컨텐츠의 유형을 나타내기 위한 방법
                          ( 형식으로 표기, *은 ‘모든’을 의미) 일종의 웹 상에서 확장자를 나타내기 위한 방법!
                 - 일반 MIME 타입 : https://developer.mozilla.org/ko/docs/Web/HTTP/MIME_types/Common_types
                 - text/html; charset=utf-8: HTML 문서, 인코딩 형식은 utf-8
                 - application/json: JSON 형식 데이터, API Request-Reseponse에서 주로 사용
                 - image/png: png 타입 이미지 데이터
                 - text/plain; charset=utf-8: 텍스트 파일 데이터, 인코딩 형식은 utf-8
                 - application/xml: xml 데이터
        - Content-Encoding: 데이터의 인코딩/압축 방식
                  - gzip: gzip 압축 (가장 대중적)
                  - deflate: deflate 압축
                  - br: brotli 압축
                  - identity: 압축하지 않음
        - Content-Length: 데이터의 바이트 단위 길이
        - Content-Language: 데이터의 언어
                  - en:일반적 영어, en-US: 미국이라는 국가의 영어
                  - ko:일반적 한국어, ko-KR: 한국이라는 국가의 한국어

  • $ curl 이라는 명령어를 사용하면, 요청-응답확인가능
       - $ sudo apt install curl 
       - $ curl –X <요청 메서드> URL (디폴트: GET)
캐시
  • 네트워크에서의 캐시란?
    - 서버의 지연을 줄이기 위해 웹 페이지, 이미지 등의 자원 사본을 임시 저장하는 웹 기술
    - HTTP는 상태를 유지하지 않는다 : 그렇다면 자원을 요청할 때마다 자원은 새롭게 응답될까? : 캐쉬가 없다면 이렇게 됨

    - 캐시된 자원이 저장되는 공간: 클라이언트(브라우저) 혹은 특별한 서버(캐시 서버, 프록시 서버)

  • cache-control 헤더
      - 관련 자료 : https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
      - cache-control 헤더로 캐시 기능을 알림
      - cache-control: max-age=숫자(초) 캐시한 자원의 지속 시간
      - cache-control: no-cache 캐시 가능한 자원이나, 항상 origin 서버에 검증하기 : 본서버에 검증하고 써라!!!
      - cache-control: no-store 캐시하면 안될 자원

  • 캐시된 자원에는 유효 기간이 있음
    - 해당 자원이 언제 마지막으로 변경되었는지를 알리는 Last-Modified 헤더

  • 캐시된 자원의 변경
    - 방법 1. 
        - 클라이언트는 요청시 if-modified-since 헤더로 특정 시점 이후 자원 변경 여부를 묻는다
        - 만일 변경되었다면 다시 다운로드
        - 만일 변경되지 않았다면 서버는 304 Not Modified 응답을 보낸다 -> "자원 변경 안됐으니까, 캐시로 Redirect 해라"

    - 방법 2. 
        - Etag를 통해 자원의 변경 여부 감지 가능
        - 서버는 캐시된 자원에 Etag라는 식별 문자를 붙이고
        - 클라이언트는 If-None-Match 헤더를 통해 해당 Etag가 변경되었는지를 물어본

       예시
        - 초기 응답: Etag 값은 abc123
        - 재요청: Etag 값이 여전히 abc123인지 확인
        - 재응답(변경되지 않은 경우): 304
쿠키
  • 쿠키(cookie)
    - 서버로부터 받은 정보를 클라이언트 측(웹 브라우저)에 임시 저장되는 이름=값 형태의 데이터
          - HTTP는 상태를 유지하지 않는 프로토콜이라 요청을 보낼 때마다 불러와야할 수도 있음.
           -> 이것의 방지를 위해 임시저장
    - 유효 기간이 있음
    - 쿠키를 전송할 도메인과 경로가 정해져 있음

    - 서버가 Set-Cookie 헤더로 쿠키를 전달하면, 클라이언트는 쿠키를 저장하여 다음 HTTP 요청의 Cookie 헤더로 활용

  • 쿠키(cookie) 확인해보기: 브라우저 à 개발자 도구 à Application à Storage à Cookies

  • 쿠키(cookie)의 도메인
       - Set-Cookie: domain=example.com
       - example.com (을 비롯한 서브 도메인)에 접근할 때 쿠키 활용

  • 쿠키(cookie)의 경로
    - Set-Cookie: path=/
         - path에 명시된 경로 하위 경로에서 쿠키 활용
    - path=/posts
         -> path=/posts/1, path=/posts/2, path=/posts/3

  • 쿠키(cookie)의 유효 기간
    - Set-Cookie: expires=Wed, 10 Aug 2023 12:00:00 GMT
    - Set-Cookie: max-age=1000

  • 쿠키(cookie)는 보안에 민감 (***단골 출제 이야기***)
      - 쿠키 정보는 탈취당하지 않도록 주의 필요 
       -> 세션과 함께 보냄

  • 쿠키(cookie)와 세션(session)
       - 쿠키의 저장/관리 주체가 클라이언트(브라우저)
       - 세션의 저장/관리 주체는 서버

       - 서버는 클라리언트를 식별할 수 있는 세션 ID를 제공하고,
       - 클라이언트는 서버에게 세션 ID를 (쿠키로) 넘겨 호스트를 식별하게 할 수 있다
    : 쿠키에 민감한 정보를 세션ID라는 특별한 정보로 바꾸어서 보냄 : 그럼 쿠키는 민감한 정보가 없이, 세션 아이디만 가짐
    -> 쿠키는 민감한 정보를 알 수 없음. 민감한 정보는 서버에서만!! 볼 수 있음 = 보안이 상승

  • 쿠키(cookie)의 보안 기능
    - Secure : HTTPS인 경우에만 전송
            - HTTPS ; S는 암호화한다는 의미!
    - HTTPOnly : 자바스크립트에서 접근 불가 (document.cookie)
            - XSS 공격 방지
컨텐츠 협상

- 예시 : 위키피디아 등에서 영어로 들어가도 한국어를 제안해줌

  • 컨텐츠 협상 (Content negotiation)
    - 클라이언트가 원하는 컨텐츠를 받을 수 있도록 서버에게 부탁하는 기능
    - 컨텐츠 타입, 언어, 인코딩 방법 등 클라이언트 맞춤 컨텐츠 제공 기능
    - Accept(-X) 헤더 이용
               - Accept: 클라이언트가 선호하는 컨텐츠 타입
               - Accept-Encoding: 클라이언트가 선호하는 인코딩
               - Accept-Language: 클라이언트가 선호하는 언어

    - 여러 맞춤 요청을 보낼 수 있음
        - 여러 맞춤 요청을 보낼 때 Quality Value 값을 기준으로 우선순위를 매길 수 있음
        - <= Quality Value(q) <= 1 (클수록 우선순위가 높음)
        -  Accept: text/html, text/plain;q=0.9,   text/*;q=0.8,   */*;q=0.7
        -  Accept-Language: ko-KR,ko;q=0.9,  en-US;q=0.8, en;q=0.7
                                      (한국어 가장 높은 우선수위, 그 다음 미국영어, 그다음영어)