mTLS는 무엇일까?
mTLS는 상호(mutual)와 TLS(Transport Layer Security)가 합쳐진 개념으로, 서버와 클라이언트가 서로 신원을 확인하는 프로토콜입니다. TLS는 서버만 신원을 확인하는데 mTLS는 클라이언트와 서버 모두 신원을 확인합니다.
서버가 클라이언트 신원을 확인하기 때문에 서버가 허용한 클라이언트만 요청을 수락합니다.
mTLS는 언제 사용할까?
서버가 클라이언트 신원 확인이 필요할 때 사용합니다.
예를 들어 public으로 공개된 API를 특정 기업만 통신해야하는 상황, 즉 B2B통신할때 mTLS를 사용합니다. 우리나라 사용 사례는 금융권 마이데이터에서 사용하는 것 같습니다. 저는 B2B통신을 위해 mTLS를 공부하게되었습니다.
mTLS 분석
mTLS는 TLS프로토콜에서 클라이언트 신원 확인 단계가 추가됩니다. 클라이언트가 서버에게 인증서를 전송하고 서버는 받은 인증서를 검증합니다. 클라이언트가 서버에게 전송하는 인증서를 클라이언트 인증서라고 합니다.
클라이언트 인증서 검증이 실패하면 서버는 요청을 거절하는 응답을 전송합니다. 거절응답은 서버마다 다릅니다. 예를 들어 403 Forbidden응답을 줄 수 있고, 5xx 응답을 줄수도 있습니다.
패킷 분석
mTLS 패킷은 저의 github에 공개되어 있습니다. nginx에 mTLS설정을 하고 패킷캡처를 했습니다.
- 패킷 파일: https://github.com/choisungwook/portfolio/tree/master/pcap_files/mTLS_with_nginx
- nginx 설정: https://github.com/choisungwook/portfolio/blob/master/computer_science/mTLS/nginx/conf/all_client_with_nginx.conf
mTLS는 TCP핸드쉐이킹 + TLS핸드쉐이킹 + 클라이언트 신원 확인단계가 있습니다. TCP 핸드쉐이킹 이후에 TLS핸드쉐이킹이 시작됩니다.
TLS핸드쉐이킹 시작부분은 TLS파라미터 협상과 서버신원확인과정입니다. 서버는 서버인증서를 클라이언트에 전송합니다.
클라이언트는 받은 서버인증서를 검증합니다. 검증이 성공하면 클라이언트 인증서를 서버에 전달합니다. 서버는 받은 클라이언트 인증서를 검증하고 검증이 끝나면 암호화 통신을 시작합니다.
실습자료
실습과정은 저의 유투브에 자세히 다룹니다. 실습자료는 저의 github에 있습니다.
- 유투브: https://youtu.be/mLNRjZO3Vds?si=qu-7zfJB9hDc559B
- 실습자료: https://github.com/choisungwook/portfolio/tree/master/computer_science/mTLS
참고자료
'전공영역 공부 기록' 카테고리의 다른 글
helmfile - 여러 helm 차트를 한번에 관리하는 도구 (0) | 2025.03.09 |
---|---|
Docker로 MySQL 컨테이너 실행 및 Sakila 샘플 데이터 불러오는 방법 (0) | 2025.03.08 |
curl에서 hosts 파일 변경 없이 테스트하는 방법 (0) | 2025.02.16 |
TCP라더니 HTTPS?! 예상치 못한 디버깅 여정(feat, openssl TLS인증서 추출방법) (0) | 2025.02.16 |
쿠버네티스 node not ready이면 어떤 일이 일어날까? (1) | 2025.02.09 |