[F-Lab 모각코 챌린지 - 8일차] - 네트워크 정리

Big One·2023년 5월 18일
0

F-Lab

목록 보기
55/69

OSI 7 계층

TCP/IP 계층에 밀려서 7계층보단 TCP/IP 계층을 쓴다.

OSI 7 계층은 물리, 데이터 링크, 네트워크, 전송, 세션, 표현, 응용 계층으로 이루어져있고

TCP/IP 계층은 물리, 데이터 링크, 네트워크, 애플리케이션 계층으로 이루어져 있다.

  • 물리 계층 - 하드웨어적으로 구성되어있고 흔히 라우터를 생각하면 된다.
  • 데이터 링크 계층 - 하드웨어적으로 구현되어있고 랜카드를 말할 수 있다. 같은 네트워크에 있는 PC들끼리 여러 데이터를 주고 받기위해 필요하고 Framing으로 구분한다.
  • 네트워크 계층 - 운영체제의 커널에 소프트웨어적으로 구성되어있다.
    IP + data로 이루어진 패킷을 가지고있다.
  • 전송 계층 - 운영체제의 커널에 소프트웨어저으로 구성되어있다.
    port번호를 가지고 최종도착지의 프로세스로 데이터가 도달할 수 있도록 해준다.

URI

URI의 형식

scheme://[@userInfo]host(IP)[:port][/path][?query][#fragment]

  • scheme: http 프로토콜을 사용한다.
  • userInfo: url에 사용자 정보를 포함해서 인증해야할 때 사용한다.
  • Host: 주소이름이다.
  • port: 포트번호이다.
  • path: 경로
  • query: 쿼리 파라미터
  • fragment: 내부 북마크 등에 사용, 서버에 전송하진 않음

웹 브라우저 요청 흐름

주소를 입력하면 DNS 에서 ip, port 를 조회하여 알아낸다.

→ http 요청메세지 생성

→ 소켓 라이브러리를 통해 전달

→ TCP정보 생성, 메세지 데이터 포함

→ IP 패킷 생성, TCP 정보 포함

→ 랜카드를 거쳐 서버에 전송함.

→ http 응답 메세지를 브라우저에 전달

TCP, UDP, PORT

TCP 가 생성된 배경

IP 프로토콜로는 한계가 있다. IP프로토콜은 연결이 제대로 됐는지 확인이 안되고, 데이터가 제대로 전송됐는지, 순서는 일정한지 확인할 수 없다. 그래서 전송될 목적지 정보를 가리키는 IP패킷에 TCP를 추가하게 되었고, 서버에 어떤 프로세스에 전송할지 구분하기 위해 PORT 번호도 추가되었다.

TCP (전송제어 프로토콜)

  • 연결지향 (3way handshake): 3단계를 거쳐 연결이 된걸 확인 후 전송한다. (SYN → SYN, ACK, → ACK 후 데이터 전송)
  • 데이터 전달 보증: 데이터를 전달받았으면 받았다는 신호를 보내고 클라이언트가 신호를 못받으면 재응답
  • 순서 보장: 순서가 다르게 전송되면 다르게 된 것 부터 재전송 요청한다.

UDP

  • TCP 보다 빠르다
  • 순서가 보장되지 않는다.
  • HTTP2.0 or 3에서 더 최적화되고 UDP를 이용해 빠른 데이터 전송을 한다.

PORT

  • 한 서버에서 실행되는 여러 프로세스(응용프로그램)를 구분하기 위해 사용한다.
  • 0 ~ 65535 까지 할당 가능하다. (단, 0~1023 까지는 사용하지 않는게 좋다.)

추가로 알아볼 것 DNS RoundRobin?

HTTP

HTTP란? 인터넷 통신을 하기위한 하나의 프로토콜(통신 규약)이다.

특징

  • 무상태(Stateless)이다.
  • 비연결성이다.

HTTP는 비연결성이다.

통신 할 때마다 3way handshake를 진행하고 데이터를 주고받는다. 하지만 한 페이지를 로드하는데 너무 많은 낭비를 하게되고 트래픽또한 과부하되어 Keep-Alive를 통해 지속연결을 한다.
지속연결 시간은 몇 초가 될수도 몇 분이 될 수도 있다.

HTTP는 무상태이다.

HTTP는 서버가 상태를 기억하지 않는 프로토콜이다. 예) C: 이거 얼마야? S: 300원 / C: 2개줘 S: ??뭘

즉, 모든것을 클라이언트에서 기억하고 필요한 정보를 보내야한다.

매 번 모든 것을 담아서 보내야하는데 크기도 부담스럽고 탈취당했을 때 문제가 발생한다. 이를 해결하기위해 쿠키를 사용하고 쿠키는 서버에서 Set-Cookie로 설정해서 보내면 브라우저에 저장되어 같은 도메인에 요청을 보낼때마다 쿠키가 포함되어 전송된다. 쿠키를 이용하여 로그인 상태 유지가 가능하다!
하지만, HTTP는 암호화 되어있지 않아 도청당하면 쿠키에 로그인 정보가 들어있어 치명적 단점이 있다. 그래서 쿠키를 설정할 때는 세션아이디, 토큰 같은 것을 이용하여 로그인 하고 개인정보에 치명적인 것들은 쿠키에 담아선 안된다.

HTTP 단점

  • 암호화 되어있지않다. → 이를 보완한 SSL을 적용한 HTTPS 가 등장했고 검색엔진 최적화에도 가산점이 된다.
  • XSS , CSRF등의 공격 방식으로 탈취 당할 수 있고 이러한 악의적인 공격을 막기위해 HTTPS 사용 , Cookie에 Secure, HttpOnly, SameSite를 설정하여 공격을 방지할 수 있다.

Secure: https일 경우에만 쿠키를 전송한다.

HttpOnly: XSS 공격 방지 , 클라이언트에서 document.cookie 접근 불가.

SameSite: CSRF 공격 방지, 요청 도메인과 쿠키 도메인이 같을 때만 쿠키 전송

캐시

이미지, HTML등 을 캐싱하여 메모리에 저장하고 도메인에 접속시 서버로부터 받아오지않고 메모리에있는 자원을 그대로 사용한다. (서버로 부터의 응답은 304 가 나옴!)

프록시 캐시

Cache-Control

  • private: 응답이 해당 사용자만을 위한 것이다. 클라이언트에 사용
  • public: CDN 서버에 사용
  • s-maxage: 프록시 캐시에만 적용되는 max-age
  • age: 오리진 서버에서 응답 후 프록시 캐시내에 머문시간

캐시 무효화

캐시를 설정하지 않아도 브라우저에서 임의로 캐싱한다.

캐시가 되면 안될때 사용하는 것들이다.

  • no-cache, no-store, must-revalidate
  • mus-revalidate 하는 이유는 캐시가 만료된 상태에서 요청시 서버가 오류났을 경우 프록시 캐시는 이전 데이터를 보여줄 수 도 있기때문에 무조건 캐시만료후엔 원서버 검증을 시켜야한다. 원서버 접근 실패시 504 error

검증헤더

ETag, Last-Modified

Last-Modified는 마지막 수정 날짜를 기준으로 캐시된 데이터가 변경되었는지 확인 후 변경되지 않았다면 유효기간을 갱신하고 캐시를 사용함. 요청시 If-Modified-Since 를 사용한다.

ETag는 해시테이블과 같이 키: 값 형태로 이루어져 있으며 값이 조금이라도 바뀌면 키는 키는 바뀐다. 요청시 If-None-Match 를 사용한다.

캐시된 데이터와 서버에 있는 데이터가 변경이 없다면 응답으로 304 코드를 주고 바디는 없이 헤더만 전송된다.

profile
이번생은 개발자

0개의 댓글