MSA 보안 문제 해결 방법 고안(1)

LSM ·2022년 2월 12일
2

현재 DMSP 프로젝트를 진행하면서 직면한 문제의 해결 과정을 작성하기 위해 지금 이 글을 쓰고 있다. 아직 여전히 해결하지 못한 과제로 해결방법에 대해 정리하고자 한다.

먼저, 문제는 MSA(MicroService Architecture)의 인증절차 방식이다.

현재 DSMP 프로젝트에서는 환자의 정보를 저장하는 서버, 해당 정보에 접근할 수 있는 뷰어에 대한 서버, 환자 메타데이터를 저장하기 위한 서버 등 각각이 독립적으로 구성된 서버들을 도커로인해 통합적으로 관리하고 있다. 문제는 프론트 단에서 환자 정보를 보여주는 뷰어 서버의 링크만 안다면 악의적인 접근이 가능하다는 점이다. 이는 프로젝트 특성상 굉장히 민감한 이슈이다...

Reverse Proxy 로 해결이 가능할까..?

이를 해결하고자 Reverse Proxy 개념을 도입해 Proxy 단에서 인증과정을 거쳐 각 서버에 접근할 수 있다면 문제를 해결 할 수 있지 않을까 라는 결론에 도달했다.
즉 Single Sign On을 통해 각 서버에 접근하자는 의미이다.

위 아키텍쳐 구조를 기반으로, API Gateway로 'Springboot cloud gateway' 를 사용해 prefilter 기능에서 따로 구축한 인증서버를 통해 JWT 토큰을 발급 받아, 이를 통해 인증/인가 과정을 spring security를 통해 구현 한다면 해결 가능한 문제로 보여진다.

MSA 서비스에서 기존의 세션 로그인 방식의 한계

프로젝트 시작 단계에서 로그인 방식을 구현 할 때, 인증과 인가에 방식에 대해 잘 숙지하지 못한 상태였기에 참고서로 가지고 있는 책에서 구현한 바와 같이 세션과 쿠키를 통한 로그인으로 구현을 했었다.

그래서 세션이 SSO 방식에 적합한가를 찾아보았다.

찾아본 결과, MSA 아키텍처라 할지라도 각 서버마다 세션을 공유한다면 가능할 것이라고 한다.

세션 클러스터링 혹은 별도의 세션공유서버나 Redis와 같은 인메모리 세션 저장소를 두어서 서버끼리 API 를 호출할 때마다 사용자의 세션여부를 체크해서 동일한 세션인지 아닌지 판단해서 처리하면 되기는 하나 Redis 같은 경우에는 유료 서비스에다, 세션 클러스터링 혹은 별도의 세션공유서버를 유지하는 것은 복잡할뿐더러 세션 자체가 서버 자원을 많이 소모하기에 MSA MSA 아키텍처에서 세션방식은 추천하지 않는다고 한다.

그래서 위와 같이 일반적으로 인증서버를 별도로 두어서 먼저 인증을 받은 후 token 을 발급받고 API Gateway 를 통과할 때 api Url 과 token 을 가지고 서버에 접속하게 되는데 이때 인증서버에서 발급받은 token 이 유효한 것인지 검증을 받은 후 처리하게 되는 구조이다.

추가적으로 찾아보니 spring cloud security 프로젝트가 있는데 세션을 이용한 방식이 아닌 oauth2, jwt 를 사용해서 MSA 인증처리를 할 수 있도록 제공하고 있다고 하는데 이는 더 알아보아야 할 듯하다.

결론 !!

지금과 같이 MSA 서비스를 운영하고, 환자 정보와 같이 보안적으로 신경 써야할 서버에 접근을 제한 하기 위해서는 리버스 프록시를 도입해 Gateway 단에서 인증과정이 필수 인것 같다. 문제는 현재 세션을 사용한 로그인 방식을 고수 할 것인가, 아니면 JWT 토큰 인증을 통한 방식으로 전환할 것인가 인듯하다..
이는 팀원간의 회의가 필요할 듯하다.

profile
개발 및 취준 일지

0개의 댓글