• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

JWT Token 구현에서 Session 을 사용한다?

22.12.16 08:57 작성 22.12.16 10:22 수정 조회수 2.12k

2

안녕하세요 강사님. 이번 수업 너무 잘 들은 학생입니다.

다름이 아니라 JWT Token 을 필터단에서 Security에게 인가처리를 맡기기 위해 Security Context 에 Authentication을 저장한다고 하셨습니다.

이는 스프링 내 세션에 인증 객체를 저장해 두는 것으로 이해를 하였습니다.

 

1.수업중에도 설명해주셨듯이, 토큰을 사용하는 것은 세션에 인증 객체를 저장하지 않도록 해서 서버적으로 부하가 걸리는 상황을 방지하는 점이 큰 장점으로 이해하였으나, 결국 시큐리티에 인가를 맡기려면 세션에 저장하는 방법 밖에 없는지 궁금합니다. 필터들 사이에서 Authentication 정보를 주고 받아야 하니 스프링 시큐리티를 사용하려면 세션 저장 말고는 방법이 없는걸까요?

2.계속 생각하다보니 또 궁금해진 사항인데, [SecurityContextHolder 에 세션 정보를 저장해두는 것이 SpringSecurity 가 일반적으로 채택하고 있는 formLogin 방식에서 사용하는 세션 저장 방식]인 것으로 이해를 했습니다.
이 때, 왜 이 부분이 계속 세션을 저장해서 서버적으로 부하가 걸리게 하는 건지 잘 이해를 못한 것 같습니다.
Authentication 과정을 살펴보면 그 때 인증을 하기 위해 형성한 Authentication 객체는 그 요청을 처리하기 위해 Thread Local 에 있는 SecurityContextHodler 에 저장을 해두고 인가를 처리하게 됩니다. 하지만 그 과정을 끝내고 나면 Holder를 비워주고, THread도 종료되기 때문에 서버 자체에는 딱히 저장되는 것은 없지 않나요? 보안적인 측면 외의 SESSION 방식의 단점을 잘 이해하지 못한 것 같습니다. 간략하게 라도 도움주시면 감사할 것 같습니다.


2번을 먼저 이해해보는게 1번을 이해하는데 도움이 될 것 같긴 하네요.

강의도 너무 잘들었습니다. 미리 감사드립니다.

답변 1

답변을 작성해보세요.

3

1번 답은

세션이라는 것을 메모리적으로 본다면 그냥 클라이언트가 요청과 응답을 할 때까지 데이터를 보관할 장소로 보셔도 됩니다.
무상태성 설정을 했기 때문에 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)

jSessionId를 관리하지 않아서, 세션이 응답이 끝나면 사라지게 됩니다.

그냥 메모리 저장소에 용도로 잠시 사용하고 버리는 용도입니다.

그래서 지속적으로 세션 메모리를 사용하지 않고, 임시로 사용하고 버리는 용도이기 때문에 큰 부하는 없습니다.

그렇다면 왜 사용하는냐가 궁금하실수 있는데!!

 

스프링 시큐리티가 시큐리티 세션을 이용해서 권한처리를 해줍니다. 이 편리한 기능을 이용하려면 세션에 임시로 넣어두는 법이 편합니다. 이렇게 넣어둔다고 해도, 로그아웃 혹은 브라우저를 닫는다고 세션이 날라가는 것이 아니라, 응답이 끝나면 세션값은 사라지게 됩니다.

 

2번 답은 1번답에서 해결될 것 같습니다.

 

 

가명님의 프로필

가명

2023.11.21

권한처리를 위해 세션을 사용하게 되면

서버가 여러대일 경우

어떤 서버에는 권한정보가 있고

어떤 서버에는 없을 수도 있지 않나요?

이런 경우 스프링 시큐리티가 자동으로 알아서 처리를 해주는건가요?

세션을 사용하지 않고 JWT 를 사용하는 이유중에 하나가

서버가 여러대 일 경우의 세션 문제를 해결하기 위함도 있다고 하셨는데

마찬가지로 서버가 여러대라면 권한처리를 위한 권한정보를 동일하게 맞춰(?) 주는 무엇인가가 필요하지 않나요?