-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
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번을 이해하는데 도움이 될 것 같긴 하네요.
강의도 너무 잘들었습니다. 미리 감사드립니다.
답변을 작성해보세요.
3
최주호
지식공유자2023.01.04
1번 답은
세션이라는 것을 메모리적으로 본다면 그냥 클라이언트가 요청과 응답을 할 때까지 데이터를 보관할 장소로 보셔도 됩니다.
무상태성 설정을 했기 때문에 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
jSessionId를 관리하지 않아서, 세션이 응답이 끝나면 사라지게 됩니다.
그냥 메모리 저장소에 용도로 잠시 사용하고 버리는 용도입니다.
그래서 지속적으로 세션 메모리를 사용하지 않고, 임시로 사용하고 버리는 용도이기 때문에 큰 부하는 없습니다.
그렇다면 왜 사용하는냐가 궁금하실수 있는데!!
스프링 시큐리티가 시큐리티 세션을 이용해서 권한처리를 해줍니다. 이 편리한 기능을 이용하려면 세션에 임시로 넣어두는 법이 편합니다. 이렇게 넣어둔다고 해도, 로그아웃 혹은 브라우저를 닫는다고 세션이 날라가는 것이 아니라, 응답이 끝나면 세션값은 사라지게 됩니다.
2번 답은 1번답에서 해결될 것 같습니다.
가명
2023.11.21
권한처리를 위해 세션을 사용하게 되면
서버가 여러대일 경우
어떤 서버에는 권한정보가 있고
어떤 서버에는 없을 수도 있지 않나요?
이런 경우 스프링 시큐리티가 자동으로 알아서 처리를 해주는건가요?
세션을 사용하지 않고 JWT 를 사용하는 이유중에 하나가
서버가 여러대 일 경우의 세션 문제를 해결하기 위함도 있다고 하셨는데
마찬가지로 서버가 여러대라면 권한처리를 위한 권한정보를 동일하게 맞춰(?) 주는 무엇인가가 필요하지 않나요?
답변 1