Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2부 8장] 통합점: 게이트웨이, 터널 릴레이 #8

Open
kmswlee opened this issue Aug 27, 2022 · 3 comments
Open

[2부 8장] 통합점: 게이트웨이, 터널 릴레이 #8

kmswlee opened this issue Aug 27, 2022 · 3 comments

Comments

@kmswlee
Copy link

kmswlee commented Aug 27, 2022

통합점 : 게이트웨이, 터널, 릴레이

  • 게이트웨이: 서로 다른 프로토콜과 애플리케이션 간의 HTTP 인터페이스
  • 애플리케이션 인터페이스: 서로 다른 형식의 웹 애플리케이션이 통신하는 데 사용한다.
  • 터널: HTTP 커넥션을 통해서 hTTP 가 아닌 트래픽을 전송하는 데 사용한다.
  • 릴레이: 일종의 단순한 HTTP 프락시로, 한번에 한 개의 홉에 데이터를 전달하는데 사용한다.

게이트웨이

  • 모든 리소스를 한 개의 애플리케이션으로만 처리할 수 없다는 것은 분명해졌다. 개발자들은 이 문제에 대한 해결책으로, 인터프리터 같이 리소스를 받기 위한 경로를 안내하는 역할을 하는 게이트웨이를 고안해냈다.
  • 게이트웨이는 리소스와 애플리케이션을 연결하는 역할을 한다.
  • 애플리케이션은 게이트웨이에게 요청을 처리해달라고 할 수 있고, 게이트웨이는 그에 응답할 수 있다.
  • 게이트웨이는 요청을 받고 응답을 보내는 포털 같이 동작하는데, 동적인 콘텐츠를 생성하거나 데이터베이스에 질의를 보낼 수 있다.

스크린샷 2022-08-27 오후 8 17 06

  • 게이트웨이는 FTP URL을 가리키는 HTTP 요청을 받는다.
  • 게이트웨이는 FTP 커넥션을 맺고 FTP 서버에 적절한 명령을 전송한다.
  • 클라이언트는 적절한 HTTP 헤더와 함께 HTTP를 통해서 문서를 받는다.

스크린샷 2022-08-27 오후 8 20 20


클라이언트 측 게이트웨이와 서버측 게이트웨이

  • 웹 게이트웨이는 한쪽에서는 HTTP로 통신하고 다른 한쪽에서는 HTTP가 아닌 다른 프로토콜로 통신한다.
  • 게이트웨이는 클라이언트 측 프로토콜과 서버 측 프로토콜을 빗금(/)으로 구분해 기술한다.
    <클라이언트 프로토콜>/<서버 프로토콜>
  • 서버 측 게이트웨이는 클라이언트와 HTTP로 통신하고, 서버와는 외래 프로토콜로 통신한다.
  • 클라이언트 측 게이트웨이는 클라이언트와 외래 프로토콜로 통신하고, 서버와는 HTTP로 통신한다.

프로토콜 게이트웨이

  • HTTP 트래픽을 바로 보낼 수 있다. 브라우저에 명시적으로 게이트웨이를 설정하여 자연스럽게 트래픽이 게이트웨이를 거쳐 가게 하거나, 게이트웨이를 대리 서버(리버스 프락시)로 설정할 수도 있다.

스크린샷 2022-08-27 오후 8 29 49

  • 일반적인 HTTP 트래픽에는 영향을 끼치지 않는다.
  • 브라우저는 일반 HTTP 트래픽은 원 서버로 바로 보낸다.
  • FTP URL을 포함한 요청은 게이트웨이로 HTTP 요청을 보낸다.
  • 게이트웨이는 클라이언트 측의 요청을 FTP 요청으로 변환하여 처리한 뒤 클라이언트에게 그 결과를 HTTP로 전송한다.

HTTP/*: 서버 측 웹 게이트웨이

스크린샷 2022-08-27 오후 8 33 10

  • 서버 측 웹 게이트웨이는 클라이언트로부터 HTTP 요청이 원 서버 영역으로 들어오는 시점에 클라이언트 측의 HTTP 요청을 외래 프로토콜로 전환한다.
  • 게이트웨이는 원 서버의 FTP 포트(21 PORT)로 FTP 커넥션을 연결하고 FTP 프로토콜을 통해서 객체를 가져온다.
  • 게이트웨이는 다음과 같은 일을 한다.
    • USER와 PASS 명령을 보내서 서버에 로그인한다.
    • 서버에서 적절한 디렉토리로 변경하기 위해 CWD 명령을 내린다.
    • 다운로드 형식을 ASCII로 설정한다.
    • MDTM으로 문서의 최근 수정 시간을 가져온다.
    • PASV로 서버에게 수동형 데이터 검색을 하겠다고 말한다.
  • 게이트웨이는 객체를 받는 대로 HTTP 응답에 실어서 클라이언트에 전송할 것이다.

HTTP/HTTPS: 서버 측 보안 게이트웨이

스크린샷 2022-08-27 오후 8 37 28

  • 기업 내부의 모든 웹 요청을 암호화함으로써 개인 정보 보호와 보안을 제공하는데 게이트웨이를 사용할 수 있다.
  • 클라이언트는 일반 HTTP를 사용하여 웹을 탐색할 수 있지만, 게이트웨이는 자동으로 사용자의 모든 세션을 암호화할 것이다.

HTTPS/HTTP: 클라이언트 측 보안 가속 게이트웨이

스크린샷 2022-08-27 오후 8 41 04

  • HTTPS/HTTP 게이트웨이는 보안 가속기로 유명하다.
  • HTTPS/HTTP 게이트웨이는 웹 서버의 앞단에 위치하고, 보이지 않는 인터셉트 게이트웨이나 리버스 프락시 역할을 한다.
  • 이 게이트웨이는 보안 HTTPS 트래픽을 받아서 복호화하고, 웹 서버로 보낼 일반 HTTP 요청을 만든다.
  • 이 게이트웨이는 원 서버보다 더욱 효율적으로 보안 트래픽을 복호화하는 암호화 하드웨어를 내장해서 원 서버의 부하를 줄여주기도 한다.
  • 하지만 이 게이트웨이와 원 서버간의 암호화하지 않은 트래픽을 전송하기 때문에, 게이트웨이와 원 서버간에 있는 네트워크가 안전한지 확인이 필요하다.

리소스 게이트웨이

  • 게이트웨이의 가장 일반적인 형태인 애플리케이션 서버는 목적지 서버와 게이트웨이를 한 개의 서버로 결합한다.
  • 애플리케이션 서버는 HTTP를 통해서 클라이언트와 통신하고 서버 측에 있는 애플리케이션 프로그램에 연결하는 서버 측 게이트웨이다.

스크린샷 2022-08-27 오후 8 46 02

  • 애플리케이션 게이트웨이에서 유명했던 최초의 API는 공용게이트웨이 인터페이스(CGI)였다.
  • CGI는 특정 URL에 대한 HTTP 요청에 따라 프로그램을 실행하고, 프로그램의 출력을 수집하고, HTTP 응답으로 회신하는데 웹 서버가 사용하는 표준화된 인터페이스 집합이다.

스크린샷 2022-08-27 오후 8 58 00

  • 게이트웨이를 통해야 받을 수 있는 리소스 요청이 들어오면, 서버는 헬퍼 애플리케이션을 생성하여 요청을 처리한다.
  • 헬퍼 애플리케이션은 필요한 데이터를 전달 받는다.
  • 전달받은 데이터는 요청 전체이거나 사용자가 데이터베이스에서 실행시키려는 질의 같은 것이다.
  • 그 다음, 바로 클라이언트로 전달할 응답이나 응답 데이터를 서버에 반환한다.
  • 서버와 게이트웨이는 별개의 애플리케이션이기 때문에 각각 가지고 있는 책임은 분명히 나뉘어 있다.

공용 게이트웨이 인터페이스

  • CGI는 최초의 서버 확장이자 지금까지도 널리 쓰이는 서버 확장이다.
  • 이는 웹에서 동적인 HTML, 신용카드 처리, 데이터베이스 질의 등을 제공하는 데 사용한다.
  • CGI가 내부에서 어떤 처리를 하는지는 사용자에게 보이지 않는다.
  • 사용자의 시각에서는 CGI가 내부적으로 일반적인 요청을 만드는 것일 뿐이다.

서버 확장 API

  • CGI 프로토콜은 구동중인 HTTP 서버에 외부 인터프리터가 쉽게 접속할 수 있게는 해주지만, 서버 자체의 동작을
    바꾸고 싶거나 서버의 처리능력을 최고치로 끌어 올리고자 서버 확장 API를 제공하였다.
  • 확장 API는 프로그래머가 자신의 코드를 서버에 연결하거나 서버의 컴포넌트를 자신이 만듣 것으로 교체해버릴 수 있게 하였다.

애플리케이션 인터페이스와 웹 서비스

  • 웹 서비스는 SOAP을 통해 XML을 사용하여 정보를 교환한다.
  • XML은 데이터 객체를 담는 데이터를 생성하고 해석하는 방식을 제공한다.
  • SOAP은 HTTP 메시지에 XML 데이터를 담는 방식에 관한 표준이다.

터널

  • 웹 터널은 HTTP 프로토콜을 지원하지 않는 애플리케이션에 HTTP 애플케이션을 사용해 접근하는 방법을 제공한다.
  • 웹 터널을 사용하면 HTTP 커넥션을 통해서 HTTP가 아닌 트래픽을 전송할 수 있고, 다른 프로토콜을 HTTP 위에 올릴 수 있다.
  • 웹 터널을 사용하는 이유는 HTTP 커넥션 안에 HTTP가 아닌 트래픽을 얹기 위해서이다.

CONNECT로 HTTP 터널 커넥션 맺기

스크린샷 2022-08-27 오후 9 33 23

  • 터널은 HTTP의 CONNECT 메서드를 사용하녀 커넥션을 맺는다.
  • CONNECT 프로토콜은 HTTP/1.1 명세에 자세히는 나와있지 않다.
  • CONNECT 메서드는 터널 게이트웨이가 임의의 목적 서버와 포트에 TCP 커넥션을 맺고 클라이언트와 서버 간에 오는 데이터를 무조건 전달하기를 요청한다.
  • CONNECT 요청
    • CONNECT 문법은 다음과 같다.
      • CONNECT home.netscape.com:433 HTTP/1.0
        User-agent: Mozilla/4.0
  • CONNECT 응답
    • HTTP/1.0 200 Connection Established
      Proxy-agent: Netscape-Proxy/1.1

데이터 터널링, 시간, 커넥션 관리

  • 터널을 통해 전달되는 데이터는 게이트웨이에서 볼 수 없어서, 게이트웨이는 패킷의 순서나 흐름에
    어떤 가정도 할 수 없다.
  • 터널이 일단 연결되면, 데이터는 언제 어디로든 흘러가버릴 수 있다.
  • 클라이언트는 성능을 높이기 위해 CONNECT 요청을 보낸 다음, 응답을 받기 전에 터널 데이터를 전송할 수 있다.
  • 하지만 이는 게이트웨이가 요청에 이어서 데이터를 적절하게 처리할 수 있어야함을 전제로 깔고 있다.
  • 게이트웨이는 네트워쿠 I/O 요청이 헤더 데이터만을 반환해줄 거라고 가정할 수 없어서, 게이트웨이는 커넥션이 맺어지는 대로 헤더를 포함해서 읽어들인 모든 데이터를 서버에 전송해야 한다.
  • 터널의 끝단 어느 부분이든 커넥션이 끊어지면, 그 끊어진 곳으로부터 온 데이터는 반대편으로 전달된다.
  • 그 다음 커넥션이 끊어졌던 터널의 끝단 반대편의 커넥션도 프락시에 의해서 끊어질 것이다.
  • 커넥션이 끊긴 한쪽에 아직 전송하지 않은 데이터는 버려진다.

SSL 터널링

스크린샷 2022-08-27 오후 9 51 04

  • 터널을 사용하면 SSL 트래픽을 HTTP 커넥션으로 전송하여 80 포트의 HTTP만을 허용하는 방화벽을 통과 시킬수 있다.
  • SSL 트래픽이 기존 프락시 방화벽을 통과할 수 있도록 HTTP 터널링 기능이 추가되었다.
  • 이 터널링 기능은 HTTP 메시지에 암호화된 데이터를 담고 일반 HTTP 채널을 통해 데이터를 전송한다.

스크린샷 2022-08-27 오후 9 55 12

  • 직접SSL 커넥션 vs 터널링된 SSL 커넥션

SSL 터널링 vs HTTP/HTTPS 게이트웨이

  • HTTPS 프로토콜은 원격 HTTPS 서버와 SSL 세션을 시작하는 게이트웨이를 두고 클라이언트 측의 HTTPS 트랜잭션을 수행하는 방식이다.
  • 응답은 프락시로 받아서 복호화하고 난 후에, HTTP를 통해 클라이언트로 전송한다.
  • 이 접근의 단점
    • 클라이언트-게이트웨이 사이에는 보안이 적용되지 않은 일반 HTTP 커넥션이 맺어져 있다.
    • 프락시가 인증을 담당하고 있기 때문에, 클라이언트는 원격 서버에 SSL 클라이언트을 할수 없다.
    • 게이트웨이는 SSL을 완벽히 지원해야 한다.
  • 이 상황에서 SSL 터널링을 사용하면, 프락시에 SSL을 구현할 필요가 없다.
  • SSL 세션은 클라이언트가 생성한 요청과 목적지 웹 서버간에 생성된다.

터널 인증

스크린샷 2022-08-27 오후 10 02 01


릴레이

  • HTTP 명세를 완전히 준수하지 않는 간단한 HTTP 프락시다.
  • 릴레이는 커넥션을 맺기 위한 HTTP 통신을 한 다음, 바이트를 맹목적으로 전달한다.
  • 단순 필터링이나 진단 혹은 콘텐츠 변환을 하는데 사용되기도 한다.
  • 일반적인 문제중 하나는, 맹목적 릴레이가 Connection 헤더를 제대로 처리하지 못해서 keep-alive 커넥션이 행(hang)에 걸리는 것이다.

스크린샷 2022-08-27 오후 10 04 36

@kmswlee
Copy link
Author

kmswlee commented Aug 28, 2022

@kmswlee
Copy link
Author

kmswlee commented Aug 28, 2022

@ruthetum
Copy link
Member

gRPC gateway

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants