웹 소켓은 ws 와 wss 프로토콜 방식을 제공하는데 이는 일반적인 URI의 HTTP 와 HTTPS와 같이 일반전송과 암호화전송 정도로 이해하면 된다.
ws 프로토콜을 이용할경우 일반적인 원문으로 전송이 되기 때문에 중요 데이터를 공격자는 그대로 볼 수 있다. 이는 DB로 본다면 비밀번호 칼럼을 그대로 원문으로 처리한것과 동일하다. 이럴경우 DB가 노출되면 그대로 암호를 볼 수 있고, 가장 큰 문제는 이 정보를 가지고 다른 사이트에 로그인 시도를 할 수 있게된다.
그 이유로 ws 프로토콜은 내부망이나 간단한 테스트 용도로만 사용해야 하며 실 서비스스에 사용한다면 해커의 맛있고 알찬 먹잇감이 될 수 있다. 따라서 wss 프로토콜을 연동해야하며 앞서 Composer를 통해 설치한 Ratchet 라이브러리는 보안 인증서만 있다면 이를 연결하여 사용할 수 있는 옵션을 제공한다.
서론이 조금 길었는데 그럼 예제를 통해 Ratchet에서 wss 프로토콜을 사용하는 방법에 대해 알아보도록 하자.
<?php # 경로: /RatchetRun.php
ini_set("display_errors", 0);
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat; // src/Chat.php 파일 참고
// Ratchet의 autoload.php 파일 경로
require __DIR__ . '/library/Ratchet/vendor/autoload.php';
define('PORT', 4343);
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
PORT
);
echo "웹 소켓 실행(PORT: ".PORT.")\n";
$server->run();
위의 방식은 앞선 포스팅에서 생성했던 RatchetRun.php 파일로 ws 프로토콜을 이용한 예제 소스 파일이다. 그럼 wss 프로토콜을 이용하기위해선 어떻게 해야할까? 나도 이부분은 공식 문서에서 찾다가 도저히 안되서 솔직히 이야기하면 GPT의 힘을 빌려 아래와 같이 완성시켰다. (고마운 GPT, 나의 동업자 ㅠ)
<?php # 경로: /RatchetWssRun.php
ini_set("display_errors", 0);
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
// 보안 프로토콜을 사용하기위한 클래스 사용 선언
use React\EventLoop\Factory;
use React\Socket\Server as ReactSocketServer;
use React\Socket\SecureServer;
require __DIR__ . '/library/Ratchet/vendor/autoload.php';
define('PORT', 4343);
// Event Loop 루프생성
$loop = Factory::create();
// WebSocket 서버 생성
$socket = new ReactSocketServer('0.0.0.0:'.PORT, $loop);
// 보안 소켓 설정
$secureSocket = new SecureServer($socket, $loop, [
'local_cert' => '/etc/letsencrypt/live/redinfo.co.kr/cert.pem', // 보안 인증서 파일중 Certificate 파일이 설치된 절대 경로
'local_pk' => '/etc/letsencrypt/live/redinfo.co.kr/privkey.pem', // 보안 인증서 파일중 Private Key 파일이 설치된 절대 경로
'verify_peer' => false, // 서버의 SSL/TLS 인증서를 검증할지 여부를 제어하는 옵션 (운영 환경에서는 true 설정이 좋으나 TCP 연결까지 지원되는 공식 SSL 인증서가 아닐 경우 false로 지정)
]);
// WebSocket 서버 설정 및 실행
$server = new IoServer(
new HttpServer(
new WsServer(
new Chat()
)
),
$secureSocket,
$loop
);
echo "웹 소켓 실행(PORT: ".PORT.")\n";
$server->run();
긴 설명은 별로 좋아하지 않는 관계로 생략하도록 하고, 궁금한 부분은 소스 복사해서 GPT에게 물어보도록 하자. 위와 같이 wss 소켓파일을 작성한 후 RatchetWssRun.php 파일로 저장을 한다음 서버 터미널을 통해 아래와 같이 실행을 해주면 된다.
# php RatchetWssRun.php
웹 소켓 실행(PORT: 4343)
우리가 작성한 프로그램이 정상적으로 실행되었다면 위와 같이 실행 후 `echo` 로 출력한 내용을 볼 수 있다. 그다음 소켓 클라이언트에선 아래와 같이 연결 부분은 ws 가 아닌 wss 로 변경 후 새로고침하여 확인해보자.
※ 웹 소켓 연결하는 클라이언트 소스는 아래의 포스팅 확인
socket = new WebSocket("wss://chat.redinfo.co.kr:4343");
위와 같이 wss 프로토콜을 이용한 방법까지 알아보았다. 이처럼 고마운 PHP의 Ratchet 라이브러리가 있기에 우리는 큰 고생없이 간단하게 웹 소켓 서버를 생성하고 쉽게 챗 프로그램을 구현할 수 있게 되었다. 다음 포스팅에서는 httpRequest 의 header 값을 이용하여 접속자를 제어하는 방법에 대해 알아보도록 하자.