코드스테이츠_S3U6_3W_수

윤뿔소·2022년 11월 9일
1

CodeStates

목록 보기
33/47

저번 네트워크 기본만 알았지만, 이번엔 네트워크를 보안을 위해계층별로 더 깊게 배워보는 시간을 갖겠다.

기본적으로 옛날엔 발신자 수신자 사이에 회선 교환 방식으로 사람이 수동으로 해줬다. 하지만 연결 됐을때 멀티라든지 즉시성이 떨어지는 한계를 맞이해 패킷 교환 방식으로 1969년도에 바뀌었다. 패킷이라는 단위로 데이터를 잘게 나누어 전송하는 방식으로 소포보내듯이 목적지, 출발지가 정해져 특정 회선 하나가 한 연결을 도맡는 것이 아니게 돼 한계를 극복했다. 소포가 보내지는 그 주소는 우리가 흔히 아는 인터넷 프로토콜(IP)이다.

IP / IP Packet

수많은 노드(서버)들이 그 복잡한 인터넷 망을 지나 어떻게 클라이언트와 통신할 수 있을까? 제대로 정해진 주소 규칙이 있기 때문에 가능하다.

- IP는 지정한 IP 주소(IP Address)에 패킷(Packet)이라는 통신 단위로 데이터 전달한다. Packet은 pack과 bucket이 합쳐진 단어로 데이터를 담을 수 있는 통신 속 단위인데, 택배에서 하나의 박스라 생각하면 된다.

그래서 서로의 약속 하에 같은 규격으로 통신해 훨씬 편한 통신이 가능해졌다.

한계

하지만 다 좋은 건 아니다. 비연결성, 비신뢰성 등의 한계가 있다.

  • 비연결성: 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷을 그대로 전송
    • 클라이언트는 서버의 상태를 파악할 방법이 없기 때문에
  • 비신뢰성
    1. 중간에 있는 서버가 데이터를 전달하던 중 장애가 생겨 패킷이 중간에 소실되더라도 클라이언트는 이를 파악할 방법이 없음.
    2. 의도하지 않은 순서로 서버에 패킷이 도착
      • 데이터의 용량이 클 경우 패킷에 나눠 전달하는데 순서가 뒤죽박죽쓰

TCP / UDP

  • 앞서 IP(인터넷 계층)만의 한계점이 있었다. 그래서 전송 계층을 따로 만드는데 그게 바로 TCP, UDP이다.
  • 가장 먼저 만들어지고 업계 표준에 가까운 TCP/IP 프로토콜의 계층을 보면 인터넷 계층 위에 전송 계층이 있다. 즉! 전송 계층으로 인터넷만의 한계를 보완한다는 뜻이다.

원리

우리가 채팅을 하여 메시지를 보낼때 어떤 일이 일어나는지 알아보자1. 프로그램이 메시지 내용을 0, 1의 인공어로 생성
2. HTTP 메시지를 Socket을 통해 전달
3. 메시지 데이터를 포함한 TCP 정보 생성
4. TCP 데이터를 포함한 IP 패킷 생성
5. LAN 카드와 같은 물리적 계층을 지나기 위해 이더넷 프레임 워크에 포함되어 서버로 전송

여기서 TCP/IP 패킷이란 기존 IP 패킷에 'TCP 세그먼트'를 추가하여 보완한 패킷이다. TCP 세그먼트에는 IP 패킷의 출발지 IP와 목적지 IP 정보를 보완할 수 있는 출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증 정보 등을 포함한다.

종류

전송 계층엔 다양하지만 크게 TCP, UDP로 나뉜다.

TCP

장치들 사이에 논리적인 접속을 성립하기 위하여 3 way handshake를 사용하는 연결지향형 프로토콜

  • 3 way handshake
    1. 클라이언트가 서버 접속 요청를 위한 SYN 패킷 발송
    2. 클라이언트에게 요청을 수락한다는 ACK 와 SYN가 설정된 패킷을 발송, 응답대기
    3. 클라가 다시 ACK를 보내 연결 성립(현재에는 ACK 뿐만 아니라 데이터도 함께 발송)
  • 정리해서 데이터 전송이 성공적이라면 응답 보내기, 패킷 순서대로 도착하지 않는다면 TCP 세그먼트에 있는 정보를 토대로 다시 패킷 전송을 요청하기 등의 기능으로 한계 돌파하는 프로토콜이다.

걍 3번 왔다 갔다해서 비연결성, 비안정성 없앰

UDP

IP에 PORT, 체크섬 필드 정보만 추가돼 TCP보다 단순화된 프로토콜
커스터마이징 가능
TCP 특징과 비교해 신뢰성은 낮지만 3 way handshake 방식을 사용하지 않기 때문에 TCP와 비교해 빠른 속도를 보장

TCP완 다르게 가벼운 편이라 신뢰성보다 연속성이 중요한 서비스면(ex) 스트리밍) UDP를 쓰는 게 낫다.

비교

참고: HTTP/3에선 TCP가 아닌 UDP로?

계층 모델

위 사진을 보면 OSI 7계층 모델, TCP/IP 4계층 모델이 있다.
컴퓨터와 키보드로만 통신하던 시절 통신의 한계를 맞이해 표준화를 통하여 어떠한 데이터가 왔을 때 호환되기 위함과 오류 발생 시 어느 파트의 오류인지 쉽게 설명 위해 나왔다. TCP/IP 4계층 모델은 실무적으로 이용할 수 있도록 현실에 맞춰 단순화된 모델이다. 7계층 봐라 얼마나 어렵냐

OSI 7계층 모델

계층을 지나며 데이터에 계층 만의 헤더를 붙이고 물리 계층을 지나 데이터가 '캡슐화'된다. 그러면 수신자는 '역캡슐화'가 일어나 어떤 데이터인지 인식한다.
어떤 것이 있는 지만 참고

  1. 1계층 - 물리 계층: OSI 모델의 맨 밑에 있는 계층으로서, 시스템 간의 물리적인 연결과 전기 신호를 변환 및 제어하는 계층입니다. 주로 물리적 연결과 관련된 정보를 정의합니다. 주로 전기 신호를 전달하는데 초점을 두고, 들어온 전기 신호를 그대로 잘 전달하는 것이 목적입니다.
    e.g. 디지털 또는 아날로그로 신호 변경
  2. 2계층 - 데이터링크 계층: 네트워크 기기 간의 데이터 전송 및 물리주소(e.g. MAC 주소)를 결정하는 계층입니다. 물리 계층에서 들어온 전기 신호를 모아 알아 볼 수 있는 데이터 형태로 처리 합니다. 이 계층에서는 주소 정보를 정의하고 출발지와 도착지 주소를 확인한 후, 데이터 처리를 수행합니다.
    e.g. 브리지 및 스위치, MAC 주소
  3. 3계층 - 네트워크 계층: OSI 7 계층에서 가장 복잡한 계층 중 하나로서 실제 네트워크 간에 데이터 라우팅을 담당합니다. 이때 라우팅이란 어떤 네트워크 안에서 통신 데이터를 짜여진 알고리즘에 의해 최대한 빠르게 보낼 최적의 경로를 선택하는 과정을 라우팅이라고 합니다.
    e.g. IP 패킷 전송
  4. 4계층 - 전송 계층: 컴퓨터간 신뢰성 있는 데이터를 서로 주고받을 수 있도록 하는 서비스를 제공하는 계층입니다. 하위 계층에서 신호와 데이터를 올바른 위치로 보내고 신호를 만드는데 집중했다면, 전송 계층에서는 해당 데이터들이 실제로 정상적으로 보내지는지 확인하는 역할을 합니다. 네트워크 계층에서 사용되는 패킷은 유실되거나 순서가 바뀌는 경우가 있는 데, 이를 바로 잡아주는 역할도 담당합니다.
    e.g. TCP/UDP 연결
  5. 5계층 - 세션 계층: 세션 연결의 설정과 해제, 세션 메시지 전송 등의 기능을 수행하는 계층입니다. 즉, 컴퓨터간의 통신 방식에 대해 결정하는 계층이라고 할 수 있습니다. 쉽게 말해, 양 끝 단의 프로세스가 연결을 성립하도록 도와주고, 작업을 마친 후에는 연결을 끊는 역할을 합니다.
  6. 6계층 - 표현 계층: 응용 계층으로 전달하거나 전달받는 데이터를 인코딩 또는 디코딩하는 계층입니다. 일종의 번역기 같은 역할을 수행하는 계층이라고 볼 수 있습니다.
    e.g. 문자 코드, 압축, 암호화 등의 데이터 변환
  7. 7계층 - 응용 계층: 최종적으로 사용자와의 인터페이스를 제공하는 계층으로 사용자가 실행하는 응용 프로그램(e.g. Google Chrome)들이 해당 계층에 속합니다.
    e.g. 이메일 및 파일 전송, 웹 사이트 조회

TCP/IP 4계층 모델

  1. 1계층: 네트워크 인터페이스 계층: OSI 계층의 물리 계층과 데이터 링크 계층에 해당하며 물리적인 주소로 MAC을 사용합니다.
    e.g. LAN, 패킷망 등에 사용됨
  2. 2계층: 인터넷 계층: OSI 계층의 네트워크 계층에 해당하며 통신 노드 간의 IP 패킷을 전송하는 기능 및 라우팅을 담당합니다.
    e.g. IP, ARP, RARP
  3. 3계층: 전송 계층: OSI 계층의 전송 계층에 해당하며 통신 노드간의 연결을 제어하고, 신뢰성 있는 데이터 전송을 담당합니다.
    e.g. TCP/UDP
  4. 4계층: ⭐️어플리케이션 계층: OSI 계층의 세션 계층, 표현 계층, 응용 계층에 해당하며 TCP/UDP 기반의 응용 프로그램을 구현할 때 사용합니다.
    e.g. FTP, HTTP, SSH

우린 프엔이니까 어플리케이션 계층(응용 계층)을 잘 알아야겠지?

HTTP

네트워크의 구조를 봤을 때 응용 계층에서 많이 쓰이는 프로토콜이 있다. 바로 그 유명한 HTTP(S)! 정의 같은 건 배웠으니 특징에 대해서 깊게 들어가보자.

특징

  • 클라이언트 - 서버 구조: 클라와 서버가 상호작용하는 구조
  • ⭐️무상태 프로토콜 (Stateless), 비연결성 (Connectionless)
  • HTTP 메세지
  • 단순함, 확장 가능

무상태

무상태: 클라의 상태를 보존 X, 사진에서 보이듯이 HTTP는 데이터를 유지하지 않는다.

왜!?

  • 서버 확장성 위함: 아래 사진은 HTTP가 상태를 가질 때 만약 장애가 있다면 그 상태들이 모두 없어져 데이터 관리가 힘들어짐, 또한 서버 1, 2, 3.. 이 있을때 서버를 옮겨서 전달해야하는데 오래 걸리고 거추장 근데 클라가 상태를 가진다면? 어떤 서버든 무상태이므로 트래픽 처리를 위해 서버 증설 등 다른 서버가 받아도 응답 가능하다! 즉, 무한한 서버 증설 쌉가능

단점이 있음

  • 상태 유지를 위해 클라이언트가 추가 데이터 전송해야함
    예: 점원 A의 부담 커짐
  • 상태를 유지해야한다면 보안 등 추가로 배워야할 것들이 생김 ㅠㅠ
    예: 브라우저 쿠키, 서버 세션, 토큰 등등

비연결성

연결을 유지해서 계속 렌더링 된다면? 서버 자원의 소모가 심해짐, 그래서 HTTP에서는 요청을 주고받을 때만 연결을 유지하고 응답을 주고 나면 TCP/IP 연결을 끊는다.

또한 비연결성 한계로 HTTP는 TCP 연결 특성상 하나의 요청을 위해 연결 - 요청 및 데이터 수신 - 종료를 하나 하나 데이터마다 받아와 오래 걸렸는데 HTTP에서 최적화를 이뤄 각각의 자원을 요청 및 응답이 다 되면 종료하는 'HTTP 지속 연결'로 한계를 돌파했다.

HTTP 메시지: 헤더

  • 배웠던 HTTP 메세지를 다시 복기하자면 바디는 표현(Representation) 데이터(전달할 실제 데이터)로 전달해 Payload를 담아 실어 나른다.
  • 그렇다면 ⭐️HTTP 헤더에는 바디의 표현 데이터를 해석할 수 있는 정보를 제공한다. 공통 표현 헤더와 응답, 요청 각각의 표현 헤더가 있다.
  • 요청
    • User-Agent, Host, Origin 등
    • 특별히 봐둬야하는 것: 콘텐츠 협상
      • Accept: 클라이언트가 선호하는 미디어 타입 전달
      • Accept-Charset: 클라이언트가 선호하는 문자 인코딩
      • Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
      • Accept-Language: 클라이언트가 선호하는 자연 언어
  • 응답
    • Server, Location, Date 등

HTTPS

HTTP Secure의 약자로, 단어 뜻 그대로 기존의 HTTP 프로토콜을 더 안전하게(Secure) 사용할 수 있음을 의미
제 3자가 패킷을 못보도록 암호화

왜 써? 만약 로그인 한다 치면 아이디와 비번 모두 데이터로 전송되는데 HTTP로만 한다면 암호화가 되지 않아 패킷을 중간에 열 수 있으면 그런 정보들이 유출되기 때문에!

HTTPS는 HTTP에 서버와 클라이언트간의 CA의 인증서를 통해 서버를 인증하는 과정과 CA 인증서 위에 데이터를 암호화하는 과정을 수행하는 프로토콜, TLS(SSL)를 더한 것이다.

암호화

암호화를 하는데 '키'라는 것으로 데이터를 가린다. 2가지가 있다. 암호화와 복호화를 하는데 같은 키면 '대칭 키 암호화 방식', 다른 키면 '공개 키(비대칭 키) 암호화 방식'

  1. 대칭 키 암호화 방식: 하나의 키, 관리 잘 해야함!
  2. 공개 키(비대칭 키) 암호화 방식: 두 개의 키

⭐️서버를 HTTPS로!

로컬에 CA로 mkcert를 사용할거기에 mkcert를 설치해서 적용해야한다. 맥 기준, 도메인으로 localhost라고 가정

1. 기본 발급 및 파일 생성

// 0. homebrew로 mkcert설치
brew install mkcert
// 1. mkcert 설치 후 로컬을 인증 기관으로 추가(시스템 루트 경로에 설치)
mkcert -install
// 2. 로컬 환경에 대한 인증서 발급
mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1
// 3. cert.pem, key.pem 파일이 생성됨, key.pem의 경우 암호이기에 깃 커밋 X, 암호처럼 다루기

2. HTTPS 서버 작성

Node.js 환경에서 HTTPS 서버를 작성하기 위해서는 https 내장 모듈을 이용. express.js를 이용해 https 서버를 만들 수 있음

node.js

const https = require('https');
const fs = require('fs');

https
  .createServer(
    {
      key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
    },
    function (req, res) {
      res.write('Congrats! You made https server now :)');
      res.end();
    }
  )
  .listen(3001);

express.js

위랑 비슷한데 중간에 미들웨어 app.use로 대체

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();

https
  .createServer(
    {
      key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
    },
    app.use('/', (req, res) => {
      res.send('Congrats! You made https server now :)');
    })
  )
  .listen(3001);

참고: ngrok로 HTTP로 만들어진 서버를 HTTPS 프로토콜로 터널링 가능! 나중에 해보자..?

🦏

profile
코뿔소처럼 저돌적으로

0개의 댓글