
프로젝트에서 유저에 대한 인증(Authentication) 에 대한 구현을 맡게 되었습니다.
본 포스팅에서는 인증 시스템으로 세션을 사용했을 때의 문제점을 기록하고자 합니다.
본격적인 Spring boot의 JWT 기반 토큰 인증 시스템 구현은 (추가 예정) 을 참고하시면 좋겠습니다.
처음에는 익숙한 방식인 서버에서 세션을 관리하는 것을 생각하였다.
보통 이러한 문제로 세션 기반 인증은 사용하지 않는 추세이다.
프로젝트에서는 당장 서버를 분산할 계획이 없었고, CORS 또한 Cookie의 설정을
바꾸어 서로 다른 Origin 간 리소스 공유를 허용한다면 해결할 수 있을 것이라 생각해 세션 인증 방식을 사용하려 했다.
Spring boot에서 세션 쿠키를 전달할 때 CORS 관련 설정을 해주었고,
Cookie에는 Same-Site 옵션은 None, Secure 옵션은 true로 해주어
서로 다른 https 도메인(클라이언트-서버) 간 쿠키를 전송할 수 있도록 했다.
설정을 마쳤으니 클라이언트와 서버 간 세션을 주고 받을 수 있을 것이라 생각했다.
그림을 보자.

프로젝트에서 HTTPS 인증서를 Load Balancer에 설치하였고, Load Balancer가 트래픽을 서버 EC2에 전달하는 방식을 통해 개발하고 있었다. (도메인 또한 Load balancer에 등록하였다.)
따라서, Front-end는 Load Balancer로 세션 쿠키를 보내게 된다.
결국 프론트의 요청이 EC2 서버에는 AWS ELB 를 통해 트래픽이 도착하는 방식이 될 것이다.
그런데, 클라이언트 - ELB 간에는 Https 통신으로 세션이 전달되지만,
ELB - EC2 는 http로 통신하기 때문에 앞서 설정한 Cookie의 secure 옵션으로 인해 EC2 서버에 세션이 제대로 도달하지 않는 것이 문제가 발생했다.
(Secure 옵션이 true인 쿠키는 HTTPS 통신에서만 전달이 가능하기 때문)
물론 SSL 인증서를 EC2 에도 설치한다면 해결할 수 있는 문제였지만,
이를 계기로 JWT 토큰 인증 시스템을 구현하기로 결정하였다.
해당 글의 시리즈 2편에서 JWT 토큰 인증 시스템 구현 과정을 설명하겠다.
글 잘 봤습니다.