프론트로 넘어가기 전 JWT 유효성 검사를 위해 configureClientInboundChannel를 사용했습니다.
다시 WebSocketConfig로 돌아가서...
WebSocketConfig
@Configuration
@EnableWebSocketMessageBroker
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
private final JwtUtil jwtUtil;
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new ChannelInterceptor() {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
if (accessor != null && StompCommand.CONNECT.equals(accessor.getCommand())) {
String token = accessor.getFirstNativeHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.replace("Bearer ", "");
// 사원 번호 찾기
String empNo = jwtUtil.getUsername(token);
accessor.setUser(new Principal() {
@Override
public String getName() {
return empNo;
}
});
}
}
return message;
}
});
}
// ...registerStompEndpoints, configureMessageBroker
}
registerStompEndpoints와 configureMessageBroker에 관한 내용은 [Spring] WebSocket & STOMP로 채팅 구현하기 (2) 여기를 참고해주시길 바랍니다.
configureClientInboundChannel를 통해 메서드를 재정의했습니다.
ChannelInterceptor의 경우 따로 클래스를 정의 구현하는 방법도 있지만, 저는 한 번에 해도 상관이 없을 거 같아서 WebSocketConfig 안에서 다 정의했습니다.
WebSocket을 처음 연결할 때만 Security Filter를 통과하고, WebSocket 연결 이후에는 Security Filter가 적용되지 않습니다.
이후 연결된 토큰을 가지고 와서 토큰 분리를 해줬습니다.
String token = accessor.getFirstNativeHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.replace("Bearer ", "");
이런 식으로 토큰을 분리해준 뒤
String empNo = jwtUtil.getUsername(token);
accessor.setUser(new Principal() {
@Override
public String getName() {
return empNo;
}
});
이렇게 로그인한 사원 번호를 찾았습니다.
아직 이 부분에 대한 내용은 공부가 더 필요한 상황인 거 같습니다..
WebSocket이 연결할 때 딱 한 번만 Security Filter를 타므로 적절한 Interceptor 설정이 필요하다는 것을 알았지만.....
Security도 함께 공부하면서 구체적으로 다시 확인해볼 필요가 있는 거 같습니다.
'자바&스프링' 카테고리의 다른 글
[Spring] WebSocket & STOMP로 채팅 구현하기 (3) (0) | 2025.03.28 |
---|---|
[Spring] Spring boot와 MySQL 연동하기 (0) | 2025.03.20 |
[Spring] WebSocket & STOMP로 채팅 구현하기 (2) (0) | 2025.03.17 |
[Spring] WebSocket & STOMP로 채팅 구현하기 (1) (0) | 2025.03.14 |