강의

멘토링

로드맵

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của canach3
canach3

câu hỏi đã được viết

Dịch vụ trò chuyện WebSocket/STOMP (spring, vue, redis)

Xử lý xác thực JWT cho stomp

StompHandler 관한 질문

Viết

·

79

0

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

spring-bootwebsocketstomp-websocket

Quiz

46% người trả lời sai. Hãy thử ngay!

STOMP가 순수 WebSocket 대비 제공하는 주요 기능은 무엇일까요?

빠른 메시지 압축

토픽(Topic) 또는 룸(Room) 개념

자동 데이터베이스 연동

HTTP 요청 방식

Câu trả lời 2

1

bradkim님의 프로필 이미지
bradkim
Người chia sẻ kiến thức

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

 

일단, 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 메시지 사용자 인증 처리 - 웹소켓 환경에서의 보안 처리 및 사용자 정보 공유 설명

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

Hình ảnh hồ sơ của canach3
canach3

câu hỏi đã được viết

Đặt câu hỏi