네트워크...
Chapter1. TCP/IP
-1. 네트워크의 시작
-2. IP/IP Packet
-3. TCP/UDP Packet
Chapter2. 네트워크 계층 모델
-1. OSI 7계층 모델
-2. TCP/IP 4계층 모델
Chapter3. HTTP
-1. HTTP의 특징
-2. HTTP Headers
Chapter4. HTTPS
-시작
미 국방성에서 당시 냉전 시대의 핵전쟁 대비를 위한 통신망 구축을 위해 1969년에 추진했던 아르파넷(ARPANET) 프로젝트에서 시작
-이전과 변경된 것
회선교환 방식 -> 패킷교환 방식
-정의
발신자와 수신자 또는 통신 쌍방이 통신을 시작하기 전에 미리 전용 연결(회선 또는 채널)을 설정해야만 하는 네트워크
-단점
상대방이 다른 상대와 이미 연결 중인 경우 그 연결이 끊어진 후에야 연결 가능
특정 회선이 끊어지면 처음부터 다시 연결해야 함
-정의
패킷이라는 단위로 데이터를 잘게 나누어 전송하는 방식. 패킷에는 출발지와 목적지 정보가 있음(IP 주소).
-장점
특정 회선이 전용선으로 할당되지 않기 때문에 빠르고 효율적으로 데이터 전송
IP: 인터넷 프로토콜
IP 주소: 네트워크상에서 컴퓨터(노드)를 식별하기 위해 부여된 위치 주소
IP 패킷: 통신 단위, packet = pack + bucket
출발지 IP 주소, 목적지 IP 주소, 전송 데이터 등
-비연결성
패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송
-비신뢰성
전송 중 패킷 소실 가능
패킷의 순서 보장 불가
TCP: 전송 제어 프로토콜
UDP: 사용자 데이터그램(패킷) 프로토콜
소켓: 네트워크 환경에 연결할 수 있게 만들어진 연결부(HTTP<->TCP)
-연결 지향 - TCP 3 way handshake(가상 연결)
-데이터 전달 보증
-순서 보장
-신뢰할 수 있는 프로토콜
-하얀 도화지에 비유(기능이 거의 없음)
-비 연결지향 - TCP 3 way handshake ❌
-데이터 전달 보증 ❌
-순서 보장 ❌
-단순하고 빠름
-신뢰성보다는 연속성이 중요한 서비스에서 자주 사용(ex. 실시간 스트리밍)
이전에는 같은 회사에서 만든 컴퓨터끼리만 통신이 가능. 따라서 다른 회사의 시스템이라도 상호 통신이 가능한 규약, 즉 프로토콜이 필요. 그래서 ISO에서 컴퓨터 제조사에 상관없이 공통으로 사용할 수 있는 네트워크 표준 규격을 정의.
-1계층.물리 계층
: 시스템 간의 물리적인 연결, 전기 신호를 변환 및 제어
-전기 신호를 전달
ex. 디지털 또는 아날로그로 신호 변경
-2계층.데이터 링크 계층
: 네트워크 기기 간의 데이터 전송 및 물리주소(ex.MAC 주소)를 결정
-물리 계층에서 들어온 전기 신호를 모아 알아 볼 수 있는 데이터 형태 처리
-주소 정보를 정의, 출발지와 도착지 주소를 확인, 데이터 처리를 수행
e.g. 브리지 및 스위치, MAC 주소
-3계층.네트워크 계층
: 실제 네트워크 간에 데이터 라우팅(최적 경로 선택)을 담당
ex. IP 패킷 전송
-4계층.전송 계층
: 컴퓨터 간 신뢰성 있는 데이터를 서로 주고받을 수 있도록 하는 서비스를 제공
-해당 데이터들이 실제로 정상적으로 보내지는지 확인
-패킷 유실, 전송 순서 변화를 바로잡아줌
ex. TCP/UDP 연결
-5계층.세션 계층
: 세션 연결의 설정과 해제, 세션 메시지 전송 등의 기능을 수행
-양 끝 단의 프로세스가 연결을 성립하도록 도와주고, 작업을 마친 후에는 연결을 끊음
-6계층.표현 계층
: 응용 계층으로 전달하거나 전달받는 데이터를 인코딩 또는 디코딩
-일종의 번역기
ex. 문자 코드, 압축, 암호화 등의 데이터 변환
-7계층.응용 계층
: 최종적으로 사용자와의 인터페이스를 제공
-사용자가 실행하는 응용 프로그램(e.g. Google Chrome)들이 해당 계층 포함됨
ex. 이메일 및 파일 전송, 웹 사이트 조회
: 헤더(데이터 링크 계층에서는 트레일러)를 붙여나가는 것. 헤더는 데이터를 상대방에게 보낼 때 각 계층에서 필요한 정보를 데이터에 추가하는데 이 정보를 의미.
L7 -> L1(캡슐화 완료) -> (전기 신호로 변환) -> (역캡슐화 시작)L1 -> L7
-1계층.네트워크 인터페이스 계층
: OSI 계층의 물리 계층과 데이터 링크 계층에 해당
-물리적 주소로 MAC을 사용
ex. LAN, 패킷망 등에 사용됨
-2계층.인터넷 계층
: OSI 계층의 네트워크 계층에 해당
-통신 노드 간의 IP 패킷을 전송, 라우팅
ex. IP, ARP, RARP
-3계층.전송 계층
: OSI 계층의 전송 계층에 해당
-통신 노드간의 연결을 제어, 신뢰성 있는 데이터 전송
ex. TCP/UDP
-4계층.어플리케이션 계층
: OSI 계층의 세션 계층, 표현 계층, 응용 계층에 해당
-TCP/UDP 기반의 응용 프로그램을 구현할 때 사용
ex. FTP, HTTP, SSH
-클라이언트: 서비스를 요청하는 측
-서버: 서비스를 제공하는 측
클라이언트, 서버 모두 응용 계층에서 동작
ex.
웹 브라우저(Google) <-> 웹 서버 프로그램
메일 프로그램(Outlook) <-> 메일 서버 프로그램
HTTP/1.1, HTTP/2 -> TCP 기반 프로토콜
HTTP/3 -> UDP 기반 프로토콜
-클라이언트 서버 구조
Request <-> Response
-무상태성(Stateless)
의미: 서버가 클라이언트의 상태를 보존하지 않음
특징: 무한한 서버 증설 가능
한계: 모든 것을 무상태로 설계할 수 없는 경우(ex. 로그인이 필요한 서비스 -> 로그인한 사용자의 경우 로그인했다는 상태를 서버에 유지해야 함)
ex. 카페
손님 = 클리아언트, 점원A = 서버A
손님의 주문, 결제 정보를 점원A가 갖고 있을 경우 -> 중간에 점원B로 변경 불가
손님의 주문, 결제 정보를 손님이 갖고 있을 경우 -> 중간에 점원B로 변경 가능
-비연결성(Connectionless)
의미: 실제로 요청을 주고받을 때만 연결을 유지(최소한의 자원으로 서버 연결 유지). (<->TCP/IP: 클라이언트가 요청을 보내지 않더라도 서버와 계속 연결 유지(서버 자원 계속 소모))
특징: 초 단위 이하의 빠른 속도로 응답, 트래픽이 많지 않은 경우 효율적
한계: 자원들을 각각 보낼 때마다 연결과 연결 종료를 반복하는 것이 비효율적
극복: HTTP 지속 연결(Persistent Connection)로 문제를 해결
-HTTP 메세지
-단순함, 확장 가능
요청, 응답 둘 다 사용
-갖고 있는 정보
표현 데이터를 해석할 수 있는 정보
ex.데이터 유형, 길이 압축 정보
-형식
field-name: field-value
field-name은 대소문자 구분 없음
ex. Content-Lenght: 3423
-용도
HTTP 전송에 필요한 모든 부가 정보를 담기 위해 사용
-표현 헤더 종류
Content-Type: 표현 데이터의 형식
Content-Encoding: 표현 데이터의 압축 방식
Content-Language: 표현 데이터의 자연 언어
Content-Length: 표현 데이터의 길이(바이트 단위). Transfer-Encoding 사용 시에는 사용 불가
-From: 유저 에이전트의 이메일 정보
-Referer: 현재 요청된 페이지의 이전 웹 페이지 주소(유입 경로 수집 가능)
A → B로 이동하는 경우 B를 요청할 때 Referer: A를 포함해서 요청
-User-Agent: 유저 에이전트 애플리케이션 정보
클라이언트의 애플리케이션 정보(웹 브라우저 정보, 등등)
어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
ex.
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/
537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
-Host: 요청한 호스트 정보(도메인)✅
하나의 서버가 여러 도메인을 처리해야 할 때 호스트 정보를 명시하기 위해 사용
하나의 IP 주소에 여러 도메인이 적용되어 있을 때 호스트 정보를 명시하기 위해 사용
-Origin: 서버로 POST 요청을 보낼 때, 요청을 시작한 주소를 나타냄
여기서 요청을 보낸 주소와 받는 주소가 다르면 CORS 에러가 발생한다.
응답 헤더의 Access-Control-Allow-Origin과 관련
-Authorization: 인증 토큰(ex. JWT)을 서버로 보낼 때 사용하는 헤더
형식: 토큰의 종류 + 실제 토큰 문자
ex.
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
-Server: 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
ex.
Server: Apache/2.2.22 (Debian)
Server: nginx
-Date: 메시지가 발생한 날짜와 시간
-Location: 페이지 리디렉션
응답 결과가 201(Created)일 경우 -> Location 값은 요청에 의해 생성된 리소스 URI
응답 결과가 3xx(Redirection)일 경우 -> Location 값은 요청을 자동으로 리디렉션하기 위한 대상 리소스
-Allow: 허용 가능한 HTTP 메서드
405(Method Not Allowed)에서 응답에 포함
ex.
Allow: GET, HEAD, PUT
-Retry-After: 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
503(Service Unavailable)에서 응답에 포함
ex.
Retry-After: Fri, 31 Dec 2020 23:59:59 GMT(날짜 표기)
Retry-After: 120(초 단위 표기)
요청 시에만 사용
-갖고 있는 정보
클라이언트가 선호하는 표현
-형식
콘텐츠;q=숫자
(q는 Quality Values, 0 <= q <= 1, 클수록 우선순위 높음, 1은 생략 가능)
ex.
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
// 우선순위
1.ko-KR 2.ko 3.en-US 4.en
-콘텐트 협상 헤더 종류
Accept: 클라이언트가 선호하는 미디어 타입 전달
Accept-Charset: 클라이언트가 선호하는 문자 인코딩
Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
Accept-Language: 클라이언트가 선호하는 자연 언어
-HTTP + SSL/TLS 프로토콜
-HTTP 요청과 응답의 내용을 암호화하여 HTTP 프로토콜을 더 안전하게 사용 가능
연산 속도 빠름
복호화에도 동일한 키를 사용하기 때문에 키 관리에 신경 써야 함
보안성 더 좋음
복잡한 연산이 필요하여 연산 속도 느림
HTTP 통신을 하는 소켓 부분에서 서버 인증, 데이터 암호화 진행에 사용됨
CA를 통한 인증서 사용
대칭 키, 공개 키 암호화 방식 모두 사용
서버 -> CA: 서버 정보, 공개 키
CA: 받은 것을 CA의 비밀 키로 암호화 -> 인증서 발급
클리이언트 -> 서버: 요청
서버 -> 클라이언트: 인증서
클라이언트: 브라우저에 이미 내장된 CA의 공개 키로 복호화(성공하면 클라이언트는 서버 정보, 서버의 공개 키 확보)
확보한 서버의 공개 키로 데이터 암호화❌
확보한 서버의 공개 키로 새로 생성한 대칭 키 암호화✅
클라이언트: 대칭 키 생성, 서버의 공개 키로 대칭키를 암호화, 서버에게 전달
서버: 전달받은 것을 비밀 키로 복호화 -> 대칭 키 확보
클라이언트 <-> 서버: 대칭 키로 암호화한 데이터 주고받음
// 대칭 키 자체는 오고 가지 않기 때문에 대칭 키가 유출될 위험이 적음
brew install mkcert
// 로컬을 인증된 발급기관으로 추가
mkcert -install
// 로컬 환경에 대한 인증서 생성(프로젝트 파일에서 입력 -> 프로젝트 파일 안에 cert.pem, key.pem 파일 생성됨)
mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1
// Node.js https 모듈 이용
const https = require('https');
const fs = require('fs');
https
.createServer(
{
key: fs.readFileSync(key.pem 경로, 'utf-8'),
cert: fs.readFileSync(cert.pem 경로, 'utf-8'),
},
function (req, res) {
res.write('Congrats! You made https server now :)');
res.end();
}
)
.listen(포트번호);
// express.js 이용
const https = require('https');
const fs = require('fs');
const express = require('express');
const app = express();
https
.createServer(
{
key: fs.readFileSync(key.pem 경로, 'utf-8'),
cert: fs.readFileSync(key.pem 경로, 'utf-8'),
},
app.use('/', (req, res) => {
res.send('Congrats! You made https server now :)');
})
)
.listen(포트번호);
// 둘 중 하나 입력
ngrok http 포트번호
ngrok http https://localhost:포트번호
참고 사이트: https://ngrok.com/