Браузер не отправлет cookie с jsessionid при handshake запросе для wwebsocket соединения

Есть бэк (rest api) на Spring Framework с использованием Spring Security.
Аутентификация пользователей настроена на использование сессий и jsessionid в cookies.
Есть фронт на React.
Запрсы через http/https работают отлично.
Но при попытке соединения с websocket возникает ошибка.
Endpoint /ws для handshake запроса защищен и требует аутентифицированного пользователя (authenticated), но браузер не отправляет cookie с jsessionid.

Настройки WebSocket на бэке:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOrigins("http://localhost:8080", "http://localhost:3000");
    }
}

jsx файл на фронте:

import { Client } from '@stomp/stompjs';
import { useEffect } from 'react';
import styles from './chatRoom.module.scss';
import { useNavigate } from 'react-router-dom';
import Button from '../../components/Button/Button';

const Chat = () => {

    const navigate = useNavigate();

    const client = new Client({

        brokerURL: 'ws://localhost:8080/ws',
        onConnect: () => {

            client.subscribe('/topic/test01', message =>
            console.log(`Received: ${message.body}`)
            );

            client.publish({ destination: '/topic/test01', body: 'First Message' });
        },
    });

    useEffect(() => {
        client.activate();
    }, []);

    const backToMyChatsPageAndDisconectChat = () => {
        client.deactivate();
        navigate('/myChats');
    };

    return (
        <div className={styles.positionButton}>
            <Button className={styles.button} click={backToMyChatsPageAndDisconectChat} name={'НАЗАД В МОИ ЧАТЫ'}/>
        </div>
    )
};

export default Chat;

Подскажите, пожалуйста, в чем может быть проблема?

Дополнение: вопрос отностися к начальному handshake(upgrade) запросу.


Ответы (1 шт):

Автор решения: polRk

У ws нет кук. Есть, конечно началиныйй http запрос, на который сервер должен сделать Connection: upgrade и превратить его в ws соединение, но с браузера куку при установлении запроса ws не отправить. Вам необходимо изменить сервер и клиент и передавать куку как сообщение внутри websocket после установки соединения

→ Ссылка