ServeletHttpResponse 와 ServeletHttpRequest
Stomp 를 사용하여 실시간 서비스 개발하기 글을 보면, 아래와 같은 코드가 있습니다.
@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 를 사용해야 합니다. 웹소켓 연결 자체가 비동기적이 때문입니다.