강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

canach3님의 프로필 이미지
canach3

작성한 질문수

웹소켓/STOMP 채팅서비스(spring, vue, redis)

stomp jwt인증 처리

StompHandler 관한 질문

작성

·

25

0

안녕하세요 강의를 토대로 프로젝트에 채팅기능을 구현중입니다.
강의에서는 StompHandler 에서 CONNECT, SUBSCRIBE 인 경우만 다루는데 저는 SEND 인 경우의 코드도 작성중입니다.
SEND 시 사용자 정보를
SecurityContextHolder.getContext().setAuthentication(auth);
이런식으로 담아서
StompController 에서
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
이런식으로 꺼내쓰려고 했습니다.
그런데 담을 때는 잘 담았는데, 막상 StompController에서 꺼낼 때는 비어져있다고(null) 합니다. 왜 비어져있는 지 알 수 있을까요? 그러면 사용자 정보를 가져올 수 있는 방법은 없는 건가요?

답변 2

1

bradkim님의 프로필 이미지
bradkim
지식공유자

안녕하세요~! 좋은 질문 주셔서 감사합니다.

 

일단, StompHandler 레벨에서 SecurityContextHolder를 사용하여 인증객체를 꺼내는건 불가능합니다.

 

Http요청이 아니기 때문에 FilterChain레벨에서 인증객체가 만들어져 있지 않습니다.

 

그래서, pricipal 즉, id또는 email을 꺼내고 싶다면 token에서 파싱해서 꺼내주시면 될것 같습니다.

0

안녕하세요, 인프런 AI 인턴입니다. canach3님.

StompHandler에서 SEND 액션을 처리하면서 사용자 정보를 SecurityContextHolder에 담고, 이를 StompController에서 꺼내 사용하려고 하셨군요. 그러나 컨트롤러에서 SecurityContextHolder에서 정보를 가져올 때 비어 있는 상황이라면, 보안 컨텍스트가 올바르게 설정되지 않았거나, 스레드 간 구조 문제가 있을 수 있습니다.

원인 및 해결책

  1. SecurityContextHolder 전략:

    • 기본적으로 SecurityContextHolderThreadLocal을 사용하여 보안 컨텍스트를 관리합니다. 이는 특정 스레드에서만 해당 정보를 공유하기 때문에, 다른 스레드에서 접근하면 정보가 없을 수 있습니다. REST API와는 달리 웹소켓 처리에서는 여러 스레드를 사용할 수 있으므로, InheritableThreadLocal 또는 다른 전략으로 변경하는 것이 필요할 수 있습니다.
  2. ThreadLocal 전략 변경:

    • SecurityContextHolder의 전략을 MODE_INHERITABLETHREADLOCAL로 변경하여, 자식 스레드에서도 상위 스레드의 SecurityContext를 공유할 수 있도록 할 수 있습니다:
      
      SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
      

  3. 메시지 컨버터 및 Interceptor 활용:

    • simpMessageSendingOperations와 같은 메시지 전송 인터페이스 및 인터셉터를 활용하여 사용자 정보를 전달하고 컨트롤러에서 이를 사용할 수 있습니다.
    • 메시지 컨텍스트에 사용자 정보를 삽입하고, 메시지가 전달될 때 이를 참조하는 방법을 고려할 수 있습니다.

관련된 정보를 더 얻고 싶으시다면, 다음 링크를 참고하시면 좋을 것 같습니다:
- 웹소켓 환경에서 SecurityContextHolder 사용과 STOMP 메시지 사용자 인증 처리 - 웹소켓 환경에서의 보안 처리 및 사용자 정보 공유 설명

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

canach3님의 프로필 이미지
canach3

작성한 질문수

질문하기