///
Search
🤔

동기와 비동기 그리고 ServletHttp~ 와 ServerHttp~ 의 차이 알아보기

태그
spring boot 3
web socket
분류

ServeletHttpResponse 와 ServeletHttpRequest

@Slf4j @RequiredArgsConstructor @Component public class CustomHandshakeHandler implements HandshakeHandler { private final TokenExtractor tokenExtractor; private final TokenAuthenticator tokenAuthenticator; private final TokenValidator tokenValidator; @Override public boolean doHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws HandshakeFailureException { try { String accessToken = tokenExtractor.getAccessTokenFromRequest(request); tokenValidator.validateAccessToken(accessToken); tokenAuthenticator.getAuthenticationUsingToken(accessToken); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); log.info("==========================================================================="); log.info("Authentication: " + authentication.toString()); log.info("==========================================================================="); } catch (ExpiredJwtException | InsufficientAuthenticationException exception) { try { setResponse(response, HttpStatus.UNAUTHORIZED, "TOKEN_01"); } catch (IOException e) { throw new RuntimeException(e); } return false; } return true; } private void setResponse(ServerHttpResponse response, HttpStatus status, String errorCode) throws IOException { response.setStatusCode(status); response.getHeaders().add("Content-Type", "application/json"); String errorMessage = "{\"errorCode\": \"" + errorCode + "\"}"; response.getBody().write(errorMessage.getBytes(StandardCharsets.UTF_8)); response.getBody().flush(); } }
Java
복사
일반적으로 우리가 익숙한건, HttpServletRequest 와 HttpServletResponse 입니다. 하지만 이곳에서는 ServerHttpResponse 와 ServerHttpRequest 가 쓰였습니다. 이들의 차이는 뭘까요?

HttpServletRequest/Response

Java Servlet API 의 일부입니다.
전통적인 동기식 웹 애플리케이션에서 사용됩니다.
동기식 프로그래밍 모델에서는 요청이 처리되는 동안 클라이언트는 응답을 기다립니다.
서버가 요청을 처리하고 응답을 반환할 때 까지 클라이언트는 대기 상태에 있습니다.

ServerHttpRequest/Response

Spring Framework의 org.springframework.http.server 에서 제공됩니다.
비동기 및 반응형 프로그래밍 모델에서 주로 사용됩니다.
비동기식 프로그래밍 모델에서는 요청이 비동기적으로 처리됩니다.
클라이언트는 요청을 보낸 후 즉시 다른 작업을 수행할 수 있습니다.
서버는 요청을 비동기적으로 준비하고, 준비가 되면 응답을 반환합니다.
HttpServletRequest/Response 처럼 헤더에 토큰을 넣을 수 없습니다!

결론

웹소켓 핸드셰이크 과정에서는 ServerHttpRequest/Response 를 사용해야 합니다. 웹소켓 연결 자체가 비동기적이 때문입니다.