토스의 게이트웨이
https://toss.tech/article/slash23-server
공통 로직 처리
: request에 대한 전처리, 후처리
: 유저 정보를 이용한 로직 수행
: 보안, 서비스 안정화를 위한 설정
- request 처리
: Sanitize를 통해 클라이언트로 부터 올바르지 않은 요청이 올 경우 이를 지우거나 바른 값으로 바꿔줌
- 유저 Passport
: 사용자 기기 정보와 유저 정보를 담은 토큰
: 넷플릭스의 PassPort라는 id 토큰을 참고하여 구현
: 게이트웨이는 이를 serialize하여 서비스에 전파. 서비스는 유저 정보 호출 없이 정보를 사용 가능
보안과 안정성
- 종단간 암호화
: 대부분의 API에 종단간 암호화를 통해 패킷 분석의 허들을 높여 안전하게 전달
: 앱에서 암호화 키를 사용하여 바디를 암호화
: 게이트웨이에서 이를 복호화하여 서비스에 전달
: 게이트웨이의 복호화 과정에서 인증/인가 로직이 처리되고 정보를 서비스로 넘겨줌
- Dynamic Security
: 매 요청에 짧은 유효기간을 가진 안전한 키갑소가 변조되지 않은 정보를 활용하여 각 요청을 서명하고 게이트웨이로 보냄
: 게이트웨이에서는 위변조를 확인
- 인증서를 이용한 인증/인가
: lstio에서 제공하는 mTLS flow 위에 게이트웨이 애플리케이션을 두어 인증 / 인가를 처리
: lstio는 인증서의 CA 유효성을 확인한 후 해당 인증서 정보를 헤더에 실어서 모든 트래픽을 게이트웨어에 전달
: 이렇게 받은 인증서를 Decode하여 X.509 extension 중 Subject Alternative Name을 활용하여 인증서로부터 사용자 정보를 얻음
- Circuit break
: 한 서비스의 응답 지연이 발생하면 해당 서비스에 의존하는 수많은 서비스들에게 응답 지연이 발생하게됨
: 이를 방지하기 위해 응답 지연을 유발하는 서비스에게 요청을 더이상 보내지 않고 빠르게 실패하게 하여 부하를 회복
: lstio를 활용하여 인프라 레이어의 서킷 브레이킹을 하거나 Resilience4J나 Hystrix와 같은 라이브러리를 이용하여 애플리케이션 레이어의 서킷 브레이킹을 수행
: 특히 게이트웨이에서 해주는 것이 좋다
모니터링
- 로깅
: 게이트웨이를 지나는 모든 요청, 응답의 Route id와 mothod, URI, 상태 코드 등을 ElasticSearch에 저장
- 메트릭
: 프로메테우스를 통해 시스템과 애플리케이션의 메트릭을 수집
: Node expoter를 통해 수집된 시스템 메트릭과 스프링의 actuator를 통해 수집된 애플리케이션 메트릭을 그라파나를 이용해 시각화하고 슬랙으로 알림을 보냄