Spring, 웹소켓 연동

Chanyoung Park·2024년 8월 7일
0

2024 이노베이션캠프

목록 보기
16/16

Git Issue - https://github.com/bocho-drive/back/issues/100#issuecomment-2272555503


[💥 트러블슈팅] 웹소켓에서 사용자 정보 불러오기

📌 배경

🎉 해결

  • Debug모드로 실행해보니, WebSocketSession객체 안에 유저정보가 담겨있던 것이다..!!!!
  • 이를 토대로, session객체에서 유저정보를 가져오는 메소드를 만들었다.
    /** 웹소켓 세션에서 사용자 정보를 가져오는 메서드 */
    public CustomUserDetails getUserDetails(WebSocketSession session) {
        Principal principal = session.getPrincipal();
        if (principal instanceof UsernamePasswordAuthenticationToken) {
            UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) principal;
            return (CustomUserDetails) token.getPrincipal();
        }
        return null;
    }
  • 이렇게 구현한 뒤, 채팅 테스트를 위해 postman으로 실행해보았다.

🤔 궁금증

1. SecurityContextHolder에 context가 공유되지 않는 구체적인 이유

  • ws://localhost:8080/api/chat/msg/6로 웹소켓 Connect를 하면, JwtFilter에 도달하여, SecurityContextHolder.setContext(context);가 되는 것을 확인했다.
  • 하지만, ChatWebSocketHandler.javaafterConnectionEstablished메소드 함수에서 SecurityContextHolder.getContext()가 Null이 되는 이유를 Thread환경이 다르다는 것을 이해했지만, 정확한 원인을 알지 못하였다.

2. WebSocketSession 객체에 사용자 정보가 담길 수 있었던 이유

  • 해결방법 당시, session객체에 사용자 정보가 담겨져 있어 이를 get하여 해결하긴 했다.
  • 하지만, session객체에 사용자 정보가 담길 수 있었던 원인을 제대로 파악하지 못했다.
profile
더 나은 개발경험을 생각하는, 프론트엔드 개발자입니다.

0개의 댓글