JWT 를 활용한 인증 시스템 구현 (1) - 세션 인증 방식의 한계

Sangwon·2023년 8월 12일

JWT 인증 과정

목록 보기
1/3
post-thumbnail

프로젝트에서 유저에 대한 인증(Authentication) 에 대한 구현을 맡게 되었습니다.

본 포스팅에서는 인증 시스템으로 세션을 사용했을 때의 문제점을 기록하고자 합니다.
본격적인 Spring boot의 JWT 기반 토큰 인증 시스템 구현은 (추가 예정) 을 참고하시면 좋겠습니다.

세션 기반 인증

처음에는 익숙한 방식인 서버에서 세션을 관리하는 것을 생각하였다.

동작 방식

  • 서버가 클라이언트로의 세션 발급 및 서버 메모리에 세션 저장
  • 클라이언트는 요청 시 세션을 전달, 서버는 해당 세션을 통해 인증

세션 방식이 최근 잘 사용되지 않는 이유

  • 세션을 저장하는 세션 저장소는, 서버의 물리 메모리에서 관리된다.이는 사용자가 증가할 경우 서버에 부담이 갈 수 있는 원인이 된다.
  • 물리 메모리에서 관리되기 때문에, 서버가 분산되는 경우 세션 저장소 간
    동기화가 필요하는 등의 복잡한 추가 작업이 필요
    하다.
  • CORS 문제에서 자유롭지 않다. 웹 브라우저의 경우 서로 다른 Origin 간
    리소스 공유를 원칙적으로 막아두고 있으며 세션 또한 여기에 포함된다.

보통 이러한 문제로 세션 기반 인증은 사용하지 않는 추세이다.

프로젝트에서 만난 세션 인증 방식의 문제점

프로젝트에서는 당장 서버를 분산할 계획이 없었고, 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 토큰 인증 시스템 구현 과정을 설명하겠다.

profile
컴퓨터공학을 전공하였고, 현재는 금융업에 종사하며 투자에 관심이 많습니다.

2개의 댓글

comment-user-thumbnail
2023년 8월 12일

글 잘 봤습니다.

1개의 답글