본문 바로가기

프론트엔드 👩🏻‍💻

HTTP 완벽 가이드(다람쥐 책)

 

참고자료: HTTP 완벽 가이드(저자: 데이빗 고을리)

 

웹이 어떻게 동작하는가.. 궁금한 것이 너무 많아, 다람쥐 책을 펼쳤다.. 
헷갈리는 것, 기억하고 싶은 부분을 기록했다.. 뭉뚱그려 큼지막한 용어 정리부터 더 궁금한 파트까지..
알차게 적어보았다.
하지만, 이 책을 뜨문뜨문 읽은 죄로 다람쥐로 변해버렸담... 🐿

 

표현한 이모지
⭐️ : 큰 키워드
✨: 세부 용어 정리
📚 : 파트, 소제목
✅ : 소제목 안의 키워드 및 설명
💡 : 예시 설명

 

 

⭐️ URI

- 정보 리소스를 고유하게 식별하고 위치를 지정하는 역할.

- 리소스에 대한 고유한 식별자

 

📚 종류

✨ 1.  URL

- 특정 서버의 한 리소스에 대한 구체적인 위치

- URL의 첫 번재 부분을 스킴(scheme), 리소스에 접근하기 위해 사용되는 프로토콜. (💡 : http://)

- 두번째 부분이 인터넷 주소

- 세번째 부분이 웹 서버의 리소스

✅ 문법:

<스킴>://<사용자 이름>:<비밀번호>@<호스트>:<포트>/<경로>;<파라미터>?<질의>#<프래그먼트>

 

✨ 2. URN

- 리소스의 위치에 대한 영향을 받지 않는 유일무이한 이름을 역할

- 리소스를 여기저기 옮기더라도 동작

- 리소스가 그 이름을 변하지 않게 유지하는 한, 여러 종류의 네트워크 접속 프로토콜로 접근해도 문제 없음

- 현재 실험 중인 상태고 널리 채택 되진 않은 상태(책 기준, 현재는 모르겠음) -> 그래서 URI나 URL이나 같은 의미로 사용해도 ㄱㅊ

 


 

⭐️ TCP

- 전송 제어 프로토콜 (http는 애플리케이션 계층 프로토콜)

- TCP는 오류없는 데이터 전송, 순서에 맞는 전달, 조각나지 않는 데이터 스트림(어떤 크기로도 보낼 수 있음)

- TCP/IP는 패킷 교환 네트워크 프로토콜의 집합

- TCP 커넥션을 맺으면, 클라이언트와 서버 컴퓨터 간에 교환되는 메시지가 없어지거나, 손상되거나, 순서가 바뀌어 수신되는 일이 없음.

 

TCP 커넥션

- <발신지 IP주소, 발신지 포트, 수신지 IP 주소, 수신지 포트> 로 커넥션 생성

 

📚 네트워크 프로토콜 스택

http(애플리케이션 계층) > TCP(전송 계층) > IP(네트워크 계층) > 네트워크를 위한 링크 인터페이스(데이터링크 계층) > 물리계층

 

📚 접속 

- TCP에서는 서버 컴퓨터에 대한 IP주소와 실행 중인 프로그램이 사용 중인 포트번호가 필요하다.

- URL로 IP주소를 알아낼 수 있음.

-DNS(도메인 이름 서비스 - IP로 변환 가능)으로 IP주소 알아낼 수 있음.

- 포트번호가 없다면, 기본값으로 80으로 가정

 

✨ TCP세그먼트의 전달

- IP 패킷 헤더(발신지의 목적지 IP주소, 기타 플래그)

-TCP 세그먼트 헤더(TCP 포트번호, TCP 재어 플래그, 데이터의 순서와 무결성 검사하기 위해 사용되는 숫자 값)

 

 

 


 

⭐️ 웹의 구성 요소

 

✨ 프록시

- 클라이언트와 서버 사이의 http 중개자

- 주로 보안을 위해 사용

- 요청과 응답을 필터링

 

✨ 캐시

- 클라이언트 가까이에 보관하는 http 창고

- 문서들 중 자주 찾는 것의 사본을 저장해두는, 특별한 종류의 프록시 서버

 

✨ 게이트웨이

- 다른 애플리케이션과 연결된 특별한 웹 서버

- 다른 서버의 중개자로 동작하는 특별한 서버

- 주로 http 트래픽을 다른 프로토콜로 변환하기 위해 사용

- 언제나 스스로가 리소스를 갖고 있는 진짜 서버인 것처럼 요청을 다룸. 클라이언트는 자신이 게이트웨이와 통신하고 있음을 알아채지 못할 것임

 

✨ 터널

- 단순히 http 통신을 전달하기만 하는 특별한 프록시

- 비 http데이터를 하나 이상의 http 연결을 통해 그대로 전송해주기 위해 사용

 

 


 

 

⭐️  프록시

- 웹 서버이기도 하고, 웹 클라이언트이기도 함(중개자 역할)

- http 클라이언트의 요청을 받아 마치 웹 서버처럼 요청과 커넥션을 적절히 다루고 응답을 돌려줘야 함

- 동시에 프록시는 요청을 서버에 보내기도 하므로 요청을 보내고 응답을 받는 올바른 http 클라이언트처럼 동작해야 한다. 

- 하나의 클라이언트만을 위하면 개인 프록시, 여러 클라이언트가 함께 사용되면 공용 프록시

 

📚 프록시 대 게이트웨이

- 프록시같은 프로토콜을 사용하는 둘 이상의 애플리케이션을 연결하고, 게이트웨이서로 다른 프로토콜을 사용하는 둘 이상을 연결.

💡:

프록시- 클라이언트와 서버 양쪽 모두에게 http로 말함

게이트웨이-http프론트엔드에 매여서 pop 이메일 백엔드를 향하고 있으므로 http/pop 게이트웨이

 

📚왜 사용하는가

- 어린이 필터: 교육사이트에서 제공하면서 동시에 성인 콘텐츠는 차단할 경우

- 문서 접근 제어자: 웹 서버들과 웹 리소스에 대한 단일한 접근 제어 전략을 구현하고 감사 추적을 하기 위해 사용

💡 : 한 회사 클라이언트에서 뉴스 페이지 접근 허가, 인터넷 컨텐츠에 접근할 수 있는 권한 부여, 서버 B에 접근하기 전에 먼저 비밀번호 요구

- 보안 방화벽: 바이러스 제거하는 웹이나 이메일 프록시가 사용할 수 있는, 트래픽을 살펴볼 수 있는 훅 제공

- 웹 캐시: 사본 관리, 문서 요청을 빠르게 제공, 비싼 인터넷 커뮤니케이션을 줄임

- 대리 프록시: 웹 서버인 것처럼 위장. 요청 받은 컨텐츠의 위치를 찾아내기 위해 가른 서버와 커뮤니케이션 시작

- 콘텐츠 라우터: 여러 서비스를 구현하는데 사용. 사용자가 필터링 서비스에 가입했다면 http 요청이 필터링 프록시를 통과하도록.

- 트랜스 코더: 서버가 클라이언트에 전달하기 전에 본문 포맷을 수정할 수 있도록. 데이터 표현방식을 자연스럽게 변환

- 익명화 프록시: 시원을 식별하는 특성들을 적극적으로 제거하며 개인정보 보호와 익명성 보장에 기여

 

📚어디에 있는가

- 출구 프록시

- 접근(입구) 프록시

-대리 프록시: 웹 서버의 이름과 IP주소로 스스로 가장하기 때문에, 모든 요청은 서버가 아닌 이 프록시로 가게 됨.

- 네트워크 교환 프록시

 

📚 어떻게 트래픽을 처리하는가

- 클라이언트 수정

- 네트워크 수정: 네트워크 인프라를 가로채서 웹 트래픽을 프록시로 가도록 조정하는 기법

- DNS 이름 공간 수정: DNS이름 테이블을 수동으로 편집하거나 서버를 계산해주는 동적 DNS 서버 사용 가능

- 웹 서버 수정

 

📚설정 방법

- 수동설정

- 브라우저 기본 설정

- 프록시 자동설정(PAC)

- WPAD 프록시 발견: 대부분의 브라우저는 자동 설정 파일을 다운받을 수 있는 '설정 서버'를 자동으로 찾아주는, 웹 프록시 자동발견 프로토콜을 제공한다.

 

 


⭐️게이트웨이

- 리소스와 애플리케이션을 연결하는 역할

- 애플리케이션은 게이트웨이에게 요청을 처리해달라고 할 수 있고, 게이트웨이는 그에 응답할 수 있다. 

- 요청을 받고 응답을 보내는 포털 같이 동작하는데, 동적인 컨텐츠를 생성하거나 데이터베이스에 질의를 보낼 수 있음.

💡 : http 클라이언트 - 게이트웨이 - ftp 서버 , https 클라이언트 - 게이트웨이 - 웹서버

즉, 웹 게이트웨이라면, 한쪽에서는 http 통신, 다른 한쪽에서는 http가 아닌 다른 프로토콜과의 통신이 가능

 


⭐️터널

- http 프로토콜을 지원하지 않는 애플리케이션에 http 애플리케이션을 사용해 접근하는 방식을 제공

 

📚SSL 터널링

- 웹 터널은 원래 방화벽을 통해서 암호화되나 SSL 트래픽을 전달하려고 개발됨. 

- SSL와 같이 암호화된 프로토콜은 정보가 암호화되어 있기 때문에 낡은 방식의 프록시에서는 처리되지 않음.

- 터널을 사용하면 SSL 트래픽을 HTTP 커넥션으로 전송하여 80포트의 HTTP만을 허용하는 방화벽을 통과시킬 수 있음.

-SSL 트래픽이 기존 프록시 방화벽을 통과할 수 있도록 HTTP 터널링 기능이 추가됨. 이 터널링 기능은 HTTP 메시지에 암호화된 날 데이터를 담고 일반 HTTP 채널을 통해 데이터를 전송함.

- 다시 말해, 터널은 http가 아닌 트래픽이 포트를 제한하는 방화벽을 통과할 수 있게 해준다. 이는 보안 SSL 트래픽이 방화벽을 통과하는데 유용하게 사용될 수 있다.

 


⭐️  쿠키

- 사용자를 식별하고 세션을 유지하는 방식

- 새로운 http 헤더를 정의

- 캐시와 충돌할 수 있어서, 대부분의 캐시나 브라우저는 쿠키에 있는 내용물을 캐싱하지 않음.

 

📚쿠키 타입

세션 쿠키

- 설정과 선호 사항을 저장하는 임시쿠키

- 사용자가 브라우저를 닫으면 삭제

지속쿠키

- 디스크에 저장되어, 삭제되지 않고 더 길게 유지 가능. 컴퓨터를 재시작하더라도 남아있음

 

✅ 둘의 차이는 파싱되는 시점 뿐

✅ 서버가 사용자를 추적하는 용도로 생성하는 유일한 단순 식별 번호만 포함하기도 함. 

💡 :  id=3333인 쿠키가 사용자에게 할당되면 서버는 이 쿠키값으로 데이터베이스에서 사용자의 정보를 찾는데 사용

 


 

⭐️  다이제스트 인증

- 다이제스트 인증의 좌우명은 "절대로 비밀번호를 네트워크를 통해 보내지 않는다"

- 비밀번호를 비가역적(이전 상태로 돌아갈 수 없는 상황)으로 뒤섞은 '지문' 혹은 '요약'을 보냄

 

✨요약(단어임):

- 정보 본문의 압축

- 단반향 함수로 동작, 128비트 요약으로 변환

-  MD5(다이제스트 알고리즘 시리즈 중 하나, '메시지 다이제스트'의 약어)라는 요약함수 사용

- 단방향 요약으로 비밀번호를 그대로 전송해야 할 필요성에서 해방. 우리는 그 대신 그냥 비밀번호에 대한 요약을 보내주고, 악의적인 집단이 쉽게 요약에서 원래 비밀번호를 해독할 수 없음을 보장하기만 하면 됨. 하지만, 요약 자체가 비밀번호임이 다름없음. 이때 '난스'라는 증표를 건네줌.

 

✨난스(nonce)

-난스를 비밀번호에 섞으면 난스가 바뀔 때마다 요약도 바뀌게 만들어줌. 이것은 재전송 공격을 막아주는데, 저장된 비밀번호 요약은 난스 값에 대해서만 유효하고, 비밀번호 없이 공격자가 올바른 요약을 계산하는 것을 막음.

 

✨ 다이제스트 인증 핸드셰이크

✅ http 다이제스트 인증 프로토콜

- 헤더를 사용하는, 강화된 인증

- 헤더에 Authorization-Info 를 새롭게 추가

 

📚 인증 순서

- 1단계: 서버는 난스값을 계산

-2단계: WWW-Authenticate 인증요구 메시지에 담아, 서버가 지원하는 알고리즘 목록과 함께 클라이언트에 전송

- 3단계: 클라이언트는 알고리즘을 선택하고 비밀번호와 그 외 데이터에 대한 요약을 계산.

- 4단계: 클라이언트는 Authorization 메세지에 요약을 담아 서버에 돌려줌. 클라이언트가 서버를 인증하길 원한다면 클라이언트 난스를 보냄

-5단계: 서버는 요약, 선택한 알고리즘, 그외 보조 데이터들을 받고, 클라이언트가 했던 그대로 요약을 계산. 자신이 계삭한 요약과 네트워크로 부터 온 요약이 같은지 확인. 클라이언트 요약 만듦. 난스를 계산해서 클라이언트로 넘겨줌

 

 


 

⭐️ 대칭키 암호법

- 인코딩 키와 디코딩 키가 같은 암호 알고리즘

 

✨ 열거 공격

- 인코딩 및 디코딩 알고리즘은 공개적으로 알려져 있으며, 키만이 유일한 비밀이다.

- 좋은 암호 알고리즘은 공격자가 코드를 크래킹하려면 이 우주에 존재하는 모든 가능한 키 값을 시도해보는 것 외에는 방법이 없음.

- 여기서 무차별적으로 키 값을 대입해보는 것 열거 공격임.

 

📚 공유키 발급 

- 발송자와 수신자가 대화하려면 둘 다 공유키를 가져야 함.

- 이러면, 어떤 누구가 은밀한 대화를 하려면, 개인 비밀키를 발급하고 그것을 기억해야 함. 이러면 수천 개의 키를 생성하고 기억해야 함

 

✨ 공개키 암호법

- 공개키 암호화 방식은 두 개의 비대칭 키를 사용. 인코딩 키와 디코딩 키가 다름.

- 인코딩 키는 모두 공개되지만, 디코딩 키는 개인만 알고 있음.

- 인코딩은 누구나 할 수 있지만, 메시지 디코딩은 소유자에게만 부여

 

 

✨  디지털 서명

- 보통 비대칭 공개키에 의해 생성. 개인키는 오직 소유자만이 알고 있기 때문에, 저자의 개인 키는 '지문'처럼 사용

 

 

 

 


⭐️   HTTPS

 

 - 보안계층(안전 소켓 계층(SSL) 혹은 전송계층 보안(TLS)이용하여 구현) 이 추가됨

- 인코딩 혹은 디코딩 작업은 대부분 SSL 라이브러리 안에서 일어나기 때문에, 보안 HTTP를 사용하기 위해 웹 클라이언트와 서버가 프로토콜을 처리하는 로직을 크게 변경할 필요는 없음.

- 대부분의 경우, TCP 입력/출력 호출을 SSL 호출로 대체하고, 보안 정보를 설정하고 관리하기 위한 몇 가지 호출만 추가하기만 하면 된다.

 

HTTPS 네트워크 프로토콜 스택

- HTTP(애플리케이션 계층) > TLS or SSL(보안 계층) > TCP(전송 계층) > IP(네트워크 계층) >network interface(데이터링크 계층)

 

📚 HTTPS 세부사항

- HTTPS는 HTTPS 프로토콜에 대칭, 비대칭 인증서 기반 암호 기법의 강력한 집합을 결합한 것

- 웹 기반 전자상거래의 고속 성장을 이끄는 주력

- HTTPS는 HTTP 메세지를 TCP로 보내기 전에 암호화는 보안 계층으로 보냄.

 

✨OpenSSL

- SSL과 TLS의 가장 인기있는 오픈소스 구현

 

✨ TLS

- SSL을 계승한 TLS 프로토콜

- 인터넷 상에서 통신을 엿보거나 방해할 수 없도록 보호

- 클라이언트/서버 애플리케이션이 도청, 변경, 메시지 위조를 방지하도록 설계된 방법으로 통신