ALPN(Application Layer Protocol Name)은 hello 메시지 교환 내에 프로토콜 협상을 포함하는 TLS 확장이에요. ALPN은 추가 왕복 없이 더 효율적으로 안전한 연결에서 처리해야 할 프로토콜을 협상할 수 있어요. 점점 인기가 높아지는 HTTP/2 프로토콜은 ALPN을 활용해 웹사이트 로드 시간을 더욱 줄이고 연결을 더 빠르게 암호화해요.
RFC 7301 사양에 따르면 ALPN을 사용해 클라이언트는 TLS ClientHello 메시지의 일부로 지원되는 애플리케이션 프로토콜 목록을 서버에 보내요. 서버는 프로토콜을 선택하고 ServerHello 메시지에서 해당 프로토콜을 다시 보내요. 따라서 애플리케이션 프로토콜 협상은 TLS 핸드셰이크 내에서 단일 왕복으로 완료될 수 있어요. 이 방법을 사용하면 서버가 각 애플리케이션 프로토콜에 다른 인증서를 연결할 수도 있어요.
sgcWebSockets 4.3.2부터 sgcWebSockets를 저희 커스텀 Indy 라이브러리로 컴파일하면 ALPN 프로토콜을 사용할 수 있어요. Indy는 기본적으로 이 프로토콜을 구현하지 않아요.
클라이언트
ALPN으로 "h2"가 필요한 새 WebSocket 클라이언트를 만들고, 연결 후 서버가 수락한 프로토콜을 확인하세요.
oClient := TsgcWebSocketClient.Create(nil);
oClient.Host := '127.0.0.1';
oClient.Port := 443;
oClient.TLS := True;
oClient.TLSOptions.ALPNProtocols.Add('h2');
oClient.Active := True;
procedure OnClientConnect(Connection: TsgcWSConnection);
var
vProtocol: string;
begin
vProtocol := TsgcWSConnectionClient(Connection).ALPNProtocol;
end;
서버
클라이언트가 "h2" ALPN 연결을 지원하는지 확인하는 새 WebSocket 클라이언트를 만드세요.
oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 443;
oServer.SSL := True;
oServer.Active := True;
procedure OnServerSSLALPNSelect(Sender: TObject; aProtocols: TStringList; var aProtocol: string);
begin
if aProtocols.IndexOf('h2') > -1 then
aProtocol := 'h2';
end;
