Yamoonjin
10
2021-07-30 15:40:46
1
100

포폴용 Blog Web Service RestApi(ddd방식) 개발중인 취준생입니다. 작업중 질문이 있습니다..ㅠㅠ


spring security 활용중 jwt token을 통한 인증방식으로 개발했는데요.

로그인 시 

SecurityContextHolder.getContext().setAuthentication(auth); 통해 토큰을 발급받은 사용자를 저장하고

로그아웃이나 회원정보 수정과 같은 작업을 수행할때 로그인한 사용자 객체를 불러올 때,

SecurityContextHolder.getContext().getAuthentication(); 으로 불러왔었는데요.


그 후 웹 소켓을 이용해 실시간 채팅기능을 작업하던 중 갑자기 로그인을 한 후에 getAuthentication()에 null로 나오더군요.

왜 그런가 고민하다 웹소켓관련 파일, 라이브러리 등을 지우고 다시 실행해봤는데 안되더라구요.

그러다 찾아낸게 

spring security config 에 설정해둔 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 세션을 생성안하는 설정을 지웠더니 다시 getAuthentication에 값이 들어오더라구요.


여기서 궁금한게, session을 활용안하는 설정을 하면 SecurityContextHolder.getContext.setAuthentication(auth);를 하면

스프링 컨택스트 홀더에 Authentication 객체가 저장이 안되는건가요?

웹소켓 작업을 하기 전에도 똑같이 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 세션을 생성안하는 설정을 해뒀었는데 그땐 왜 잘 되던걸가요? ㅠㅠ 혼자 인터넷 뒤져보며 작업을 하다보니 참 어렵네요 ㅠㅠ


.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 이 설정의 의미를 자세히 알려주시면 감사하겠습니다!


0
  • 답변 1

  • Mux
    411
    2021-07-30 16:00:47 작성 2021-07-30 16:01:40 수정됨

    Spring Security에서 세션을 무상태(STATELESS)로 설정하신다면,

    사용자가 인증과정을 통해 생성된 Authentication객체가 저장되지 않습니다.

    무슨 뜻인지 간략하게 설명드리겠습니다.



    1. Spring Security를 통해 인증과정을 거친 유저의 Authentication이 생성됨
    2. Authentication은 SecurityContext의 Authentication에 저장됨
    3. SecurityContext는 Security의 필터가 끝나고 HttpSessionSecurityContextRepository라는 저장소에 인증정보를 저장함
    4. SecurityContext는 유지되지 않고 폐기된다.
    5. 다음 요청이 들어오면 Security Context를 다시 생성하고, 이전에 검증한 Authentication이 있는지 HttpSessionSecurityContextRepository에서 찾는다.
    6. 찾게 되면 Authentication을 SecurityContext에 setAuthentication을 호출하여 저장한다.


    완전 간단하게 세부 기능을 제외하고 말씀드렸습니다.
    이 때 개발자가 SESSION을 STATLESS(무상태)로 지정하면 위 설명중 3번의 내용이 수행되지 않습니다.

    3번의 내용을 보면 HttpSessionSecurityContextRepository라는 곳에 저장을 한다는 것인데,

    위 내용은 SecurityContext정보를 HttpSession에 저장하는 것입니다.

    그런데 개발자가 SESSION을 STATLESS로 지정하면 3번 과정의 HttpSession을 사용하지 않기 때문에,

    해당 과정에서 인증된 Context가 저장되지 않는 것이고, 6번 과정에서 저장되지 않았기에 이전 정보를

    찾지 못해 Authentication이 null로 나오는 것입니다.


  • 로그인을 하시면 답변을 등록할 수 있습니다.