지금까지는 main파일 하나에 이것저것 쑤셔넣어서 테스트만 해봤는데, 인증서버 구현에 몇가지 핵심적인 지식들을 공부한 후에 바로 인증서버의 기초를 다져봤다. 일단은 "채팅 서버만 제대로 구현해보자" 가 첫 목표였는데 생각보다 신경써야할 부분이 많아서 중간 점검 느낌으로 글을 남긴다.

 

처음에는 게임서버 강의에서 공부했던 윈도우 IOCP랑 똑같이 구성하려 했는데 epoll이랑 IOCP가 생각보다 차이가 커서 고민을 많이 해야했다. 특히 이벤트 대기함수에서 이벤트를 수신할때가 달라서 이부분을 구현하느라 고생했다. IOCP의 경우 read, write, accept 이벤트가 확실하게 구분된 상태로 스레드에게 이벤트가 전달되지만, epoll은 소켓에 read, write 이벤트가 발생했다. 이런식으로 전달되기 때문에 한번의 이벤트 발생에 대해서 read와 write를 모두 처리해줘야 할 때가 있다. 확실히 IOCP가 더 고수준 언어라고 느끼는 부분.

 

지금까지 에코서버 구현한 부분을 프로세스 진행 순서로 보면 이렇다.

  1. 서버프로그램 실행
  2. SSL_CTX 생성/설정
  3. listen socket 생성, 바인딩, listen
  4. epoll 생성
  5. epoll에 listen socket 등록
  6. epoll_wait에서 accept event 대기
  7. 클라이언트에서 connect 요청 -> listen socket이 accept
  8. 서버가 클라이언트에 SSL 연결 요청 -> SSL 핸드셰이크 성공
  9. client가 메시지 보냄 -> 서버가 메세지 복호화 한 후 다시 클라이언트에게 암호화 하여 전달
  10. 클라이언트 disconnect

이중에서 서버가 메시지를 다시 암호화해서 전달하는 부분만 빼고 구현에 완료했고, 오류발생시 처리에 대한 부분도 완성했다.

아직은 싱글스레드로만 작동하고, 멀티스레드에서도 문제없이 작동하도록 구현하려 노력헀다.


 

아무튼 처음에는 openssl 공부할 때 만든 코드를 기반으로 하고, 함수로 묶으면 좋겠다 싶은 부분을 모듈화 하는 식으로 시작했다.

 

openssl example with.C/C++

도커 debian:trixie 컨테이너환경에서 작성된 글입니다.ai의 도움과 여러 블로그를 참조하며 작성된 게시글입니다. SSL/TLS 그리고 인증서란 무엇인가유튜브 채널 생활코딩의 강의영상을 보고 정리한

dodontak.tistory.com

 

그런데 이렇게 하니 너무 주먹구구식으로 가고, c++의 클래스 기능을 잘 활용하지 못하는 것 같다고 생각됐다.

그래서 일단 게임서버 강의에서 썼던 클래스 구성을 배껴서 구현해봤다. 그러면서 느낀건 객체지향을 잘 써먹으려면 역할의 구분이 가장 중요하다는 것.

accept를 담당하는 Listener. epoll관련 동작을 담당하는 EpollCore. 클라이언트와의 송수신을 담당하는 Session. 이들을 총괄적으로 관리하는 Service. epoll_wait에서 세션과 등록한 이벤트가 뭔지 받기위한 EpollEvent. SSL통신을 처리하는 SslObject. 등등 핵심적인 역할을 하는 클래스를 뼈대 느낌으로 설정하고, 이 클래스들이 원활하게 돌아가게 하고 사용하기 쉽게 하기위해서 여러가지 유틸 클래스들을 만드는 식으로 작업하니까 가닥이 좀 잡혔다.

 

그리고 각 클래스에서 shared_ptr과 weak_ptr로 들고있는 클래스가 뭔지도 보기좋게 정리해서 순환참조 문제가 발생하지 않도록 신경썼다.

 

 

일단 앞으로 남은 목표는 이렇다.

1. 에코서버 만들기(거의 끝남)

2. 스레드풀, protobuf, jobqueue 적용시킨 채팅서버 만들기

3. db커넥션 풀 적용시켜서 db컨테이너들과 연결시키기

4. 세부적인 인증서버 로직 구현하기

 

처음에 시작할때는 '2주일만에 다 만들어버리는거 아니야? ㅋㅋ' 했는데 이런 구조 짜는것도 거의 처음이고, 모르는거 공부하는데도 시간을 쓰다보니 생각보다 오래 걸리고 있다. 프로젝트 시작부터 지금까지 한 열흘 걸렸으니 총 기간 4주 안에는 완성시키는걸 목표로 해보자.

 

글로 남기려니 너무 횡설수설 하는데, 다른 개발 블로그를 좀 참조좀해야겠다. 프로젝트 진행에 대한 글을 어떻게 쓰는지...

+ Recent posts