네트워크 심화

KoEunseo·2022년 9월 8일
0

CS

목록 보기
4/8

HTTP 메시지 생성
소켓을 통해 전달(네트워크 환경에 연결할 수 있게 만들어진 연결부)
IP패킷을 생성하기 전 TCP 세그먼트 생성
TCP/IP 패킷 이더넷 프레임워크에 포함되어 서버로 전송

TCP vs UDP

TCP UDP
연결지향 비연결
데이터 전달 보증 데이터전달 미보증
순서 보장 순서 미보장
신뢰성 단순하고 빠름, 실시간 스트리밍에 사용

OSI 7 Layers

음 여기에 대해서는 전에 언급한 적이 있어서 그 내용으로 대체하면 좋을것같다.

HTTP/네트워크 기초 노트정리본에서 발췌
https://velog.io/@koyk0408/HTTP%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88

1계층: Physical, 물리계층. 전기신호를 주고받는다.(리피터: 전기신호를 증폭. 원래 신호로 복원한다.)
2계층: Data Link, 인접 시스템 간 데이터를 전송한다.(브리지)
3계층: Network, 단말 간 데이터 전송을 위해 최적의 경로를 제공한다.(라우터. IP패킷 전송)
4계층: Transport, 종단시스템 간 투명한 데이터(신뢰성있는) 전송.(TCP/UDP)
5계층: Session, 대화...라고 했는데ㅎ
6계층: Presentation, 표현계층. 데이터의 형식을 어떻게 표현하느냐 하는 문제. 보안관련.
7계층: Application, 응용계층. 사용자와 네트워크 간 연결, 데이터 생성.

각 계층은 독립적. 데이터를 전송할때는 상위->하위로 각 계층에서 헤더를 추가하여 전달되고 데이터를 전달받을때는 하위->상위로 각 계층에서 헤더를 제거해나가면서 이루어진다. 전자는 캡슐화, 후자는 역캡슐화라고 한다.

TCP/IP 4계층

1계층: 네트워크 인터페이스 계층(물리+데이터링크)
물리주소(MAC)사용. LAN, 패킷망
2계층: 인터넷계층(네트워크)
통신 노드 간 IP패킷 전송 및 라우팅. IP, ARP(IP(논리주소)->MAC(물리주소)), RARP(ARP의 반대. MAC->IP)
3계층: 전송계층
통신 노드간 연결 제어, 신뢰성있는 데이터 전송. TCP/UDP
4계층: 어플리케이션 계층(세션+표현+응용)
TCP/UDP기반 응용프로그램 구현. FTP(원격파일전송), HTTP, SSH

HTTP

HTTP/1.1, HTTP/2 : TCP
HTTP/3 : UDP

  • 클라이언트 서버 구조
    : 요청하면 응답한다.
  • 무상태 프로토콜, 비연결성
    : 서버가 클라이언트의 상태를 보존하지 않는다.
    무상태는 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다. 응답 서버를 쉽게 바꿀 수 있어 무한한 서버 증설이 가능하다.
    무상태에서는 클라이언트가 요청하면 필요한 데이터를 다 담아서 보내기 때문에 아무 서버나 호출해도 괜찮다.
    비연결성을 가지는 http에서는 필요할때만 연결을 유지하기 때문에 최소한의 자원으로 서버 유지가 가능하다.
    기본적으로 http는 연결을 유지하지 않는 모델이다.
  • HTTP 메시지
  • 단순함, 확장 가능

Representation Headers

  • HTTP 메시지: header + body
  • body: message body 통해 표현 데이터 전달
    이 데이터를 실어 나르는 부분을 페이로드라고 함
  • 표현: 요청이나 응답에서 전달할 실제 데이터를 뜻한다.
  • 표현 헤더: 표현 데이터를 해석할 수 있는 정보 제공
    데이터유형(html, json), 데이터길이, 압축정도 etc..

헤더 형식: <field-name> : <field-value>

//<표현헤더>--------------
Content-Type: text/html;charset=UFT-8 
//Content-Type 표현 데이터의 형식//Content-Encoding 표현 데이터의 압축방식//Content-Language 표현데이터의 자연언어
Content-Length: 3423
//Content-Length 표현데이터의 길이
//<표현데이터>-----------
<html>
  <body>...</body>
</html>

요청에서 사용되는 헤더

  • From
    유저 에이전트의 이메일 정보. 검색엔진에서 주로 사용
  • Referer
    현재 요청된 페이지의 이전 웹 페이지 주소. 유입경로 수집.
    referrer의 오탈자임
  • User-Agent
    클라이언트의 애플리케이션 정보. 통계 정보. 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능.
  • Host
    요청한 호스트 정보(도메인)
    필수 헤더.
    하나의 서버가 여러 도메인을 처리해야 할 때 호스트 정보를 명시하기 위해 사용
    하나의 IP주소에 여러 도메인이 적용되어 있을 때 호스트 정보 명시하기 위해 사용
  • Origin
    서버로 POST 요청 보낼때 요청을 시작한 주소를 나타낸다.
    요청을 보낸 주소와 받는 주소가 다르면 CORS error
    응답 헤더의 Access-Control-Allow-Origin
  • Authorization
    인증 토큰을 서버로 보낼 때 사용하는 헤더
    토큰종류+실제토큰문자 형식으로 전송

응답에서 사용되는 헤더

  • Server
    요청을 처리하는 ORIGIN 서버의 소프트웨어 정보
Server: Apache/2.2.22 (Debian)
Server: nginx
  • Date
    메시지가 발생한 날짜와 시간
Date: Tue, 15 Nov 1994 08:12:31 GMT
  • Location
    페이지 리디렉션
    웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 리다이렉트(자동 이동)
    201(Created): Location 값은 요청에 의해 생성된 리소스 URI
    3xx(Redirection): Location 값은 요청을 자동으로 리디렉션하기 위한 대상 리소스를 가리킴
  • Allow
    허용 가능한 HTTP 메서드
    405(Method Not Allowed)에서 응답에 포함
Allow: GET, HEAD, PUT
  • Retry-After
    유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
    503(Service Unavailable): 서비스가 언제까지 불능인지 알려줌
Retry-After: Fri, 31 Dec 2020 23:59:59 GMT(날짜 표기)
Retry-After: 120(초 단위 표기)

참고https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

Content negotiation

협상 헤더는 요청시에만 사용된다.
Accept: 클라이언트가 선호하는 미디어 타입 전달
Accept-Charset: 클라이언트가 선호하는 문자 인코딩
Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
Accept-Language: 클라이언트가 선호하는 자연언어

헤더에 원하는 콘텐츠에 대한 우선순위를 지정할 수 있다.
1부터 0까지 우선순위를 부여한다.

Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
생략하는 경우 1. 위에서 KO-KR은 1이라 생략됨
1. ko-KR;q=1
2. ko;q=0.9
3. en-US;q=0.8
4. en;q=0.7

HTTPS

HTTP Secure의 약자이다.
요청과 응답으로 오가는 내용을 암호화한다.

SSL/TLS 프로토콜

  • CA를 통한 인증서 사용
    브라우저가 서버의 응답+서버의 신원을 보증하는 인증서를 확인한다.
    인증서 발급 기관을 CA(Certificate Authority)라 함
    서버는 인증서를 발급받기 위해 CA로 서버의 정보와 공개키를 전달한다. CA는 서버의 공개키와 정보를 CA의 비밀키로 암호화해 인증서를 발급한다.
  • 대칭키, 공개키 암호화 방식 모두 사용
    사용자는 위의 과정을 통해 공개키를 확보한다. 이 공개키는 클라이언트와 서버가 함께 사용하게 될 대칭키를 주고받을때 쓰게 된다.

실습

mkcert
https://github.com/FiloSottile/mkcert

Homebrew를 통해 설치(macOS)

brew install mkcert

인증서 생성

  1. 로컬을 인증된 발급기관으로 추가
mkcert -install
//비번 치라고 나오는데 컴퓨터 비번 치면 됨
  1. 로컬환경에 대한 인증서
mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

localhost, 127.0.0.1(IPv4), ::1(IPv6)에서 사용할 수 있는 인증서
cert.pem, key.pem이라는 파일이 생성되었다.

⚠️ key.pem은 개인키임. git에 커밋되면 안된다.

HTTPS 서버 작성

node.js 환경에서 https 내장 모듈을 이용해서 작성 가능하다. express.js를 통해서 만들수도 있다.
방금 생성한 인증서 파일들을 HTTPS 서버에 적용해주는 작업이 선행되어야한다.

  • __dirname은 현재 실행 중인 파일 경로를 말하는 것으로, 절대경로를 넣어주면 된다.
  • 로컬은 인증된 발급기관으로 등록이 되어있고, 인증서는 서버와 같은 경로에 있어야 한다.

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('OPEN https server now :)');
      res.end();
    }
  )
  .listen(3001);

express.js

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('OPEN https server now :)');
    })
  )
  .listen(3001);

ngrok으로 터널링도 가능하다.

HTTP로 만들어진 서버를 HTTPS 프로토콜로 터널링 해주는 프로그램이라고 함!
https://ngrok.com/

profile
주니어 플러터 개발자의 고군분투기

0개의 댓글