caffeine-library / pro-spring-5

🌱 전문가를 위한 스프링5를 읽는 스터디
5 stars 0 forks source link

[question] websocket-api-cfg 예제> 연결 버튼 클릭 시> 403 내려옴 #105

Closed binchoo closed 2 years ago

binchoo commented 2 years ago

질문

17장 첫 번째 예제인 [websocket-api-cfg] 에서 웹 소켓 연결이 되지 않는 현상.

상세 내용

연결 버튼 클릭하여 웹소켓 연결 시도> 곧이어 "연결 해제됨" 상태 출력됨 & 실제 연결 수립 없음. GIF 2021-12-18 오후 2-33-17

연관 챕터

103

@caffeine-library/readers-pro-spring-5

binchoo commented 2 years ago

OriginHandshakeInterceptor

웹 소켓 핸들러 매핑을 등록할 때, allowedOrigins를 설정 가능한데요. 기본값은 빈 리스트이며, 이 경우 동일한 오리진의 요청만 핸들러가 처리 해 줍니다.

OriginHandshakeInterceptor는 핸드셰이크 요청 헤더의 Origin과 allowedOrigins의 일치를 확인하는 인터셉터입니다. image

여기서 WebUtils.isSameOrigin()을 호출하는데 까보면 URL의 스키마 역시 같아야만 동일한 오리진으로 판단합니다.

핸들러가 인지하는 핸드셰이크 URL과 오리진 헤더의 URL은 각각 스키마가 ws://, http:// 로 다르죠. 그러니 핸드셰이크 인터셉터가 실패하고 403 에러를 내놓게 됩니다. image

setAllowedOrigins 설정

웹 소켓 핸들러의 allowedOrigin를 빈 리스트로 두면 무조건 403 오류를 만나는 구조입니다; http:// 형식의 허용 오리진을 추가해 줍니다.

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(echoHandler(), "/echoHandler").setAllowedOrigins("http://127.0.0.1:8080");
    }

    @Bean
    public EchoHandler echoHandler() {
        return new EchoHandler();
    }

}