[Spring Boot] 10. 스프링 웹 MVC-2: Spring HATOAS, CORS

Spring HATEOAS

Spring HATEOAS : HATEOAS를 구현하기 편리한 기능 제공

HATEOAS

  • Hypermedia As The Engine Of Application State

  • Server: 현재리소스와 ‘연관된 링크 정보’를 클라이언트에게 제공

  • Client: ‘연관된 링크 정보’를 바탕으로 리소스에 접근

  • ‘연관된 링크 정보’

    • Relation
    • Hypertext Reference
  • spring-boot-starter-hateoas 의존성 추가 : 많은 것을 자동 설정, 그중 큰 2가지

    1. ObjectMapper 제공
    • 스프링 MVC에서 객체 JSON변환시 사용하였던 바로 그것
    • start-web만 의존성해도 추가가 되었음
    • 웹MVC와 마찬가지로 Jackson2ObjectMapperBuilder, spring.jackson.* 등이 제공
    1. LinkDiscovers 제공
    • 직접 사용하게 될 일은 많지 않음
    • 클라이언트 쪽에서 링크 정보를 Rel 이름으로 검색가능한 XPath 확장 클래스
  • 상세히 알려면 아래 가이드를 순서대로 볼 것

  • 진정한 REST API 를 만들 수 있는 방법

  • REST API 공부할 때 다시1

CORS

SOP & CORS : 웹브라우저의 표준 기술

  • SOP: Single-Origin Policy

    • 기본값
    • 같은 Origin에만 요청을 보낼 수 있다
    • 예를 들어 http://localhost:8080의 REST API를
      http://localhost:10080의 어플리케이션이 호출할 수 있는가?
      -> 실패 ! SOP 위배! Ajax 호출같은거 안됨
    • 우회하는 기법이 Ajax 초창기에 많이 소개되었음
  • CORS: Cross-Origin Resource Sharing -> SOP를 우회하기 위한 표준 기술

    • 서로 다른 Origin끼리 Resource를 공유 할 수 있다
    • 표준, 스프링 MVC가 지원해서 포함됨
    • 스프링 MVC에서 설정하려면 여러가지 빈 설정이 필요한데
      스프링부트를 쓰면 자동 설정 되어 있으므로 빈 설정 없이 바로 사용 가능
    • 스프링 MVC @CrossOrigin
  • Origin

    • URI 스키마 (http, https)
    • hostname(google.com, localhost)
    • 포트(8080,80)

예제)

  • 프로젝트 A, 프로젝트B 2개가 필요
  • A프로젝트는 /hello요청시 @ResponseBody로 “hello” 문자열을 리턴하는
    핸들러를 가진 컨트롤러를 만든다
  • A프로젝트는 REST API 서버역할을 하며 8080포트로 실행한다
  • B프로젝트는 다른포트로 하기위해서 application.properties에 server.port=18080로
    설정하고 index.html을 만들고 그곳에 REST API호출을 한다
  • AJax사용을 위해 jquery를 WebJar로 의존성을 추가한다
    html맨 밑에 스크립트 추가. load시 자동으로 API 요청한다
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <script src="/webjars/jquery/3.3.1/dist/jquery.min.js"></script>
    <script>
    $(function(){
    $.ajax("http://localhost:8080/hello")
    .done(function(msg){
    alert(msg);
    })
    .fail(function(){
    alert("fail");
    })
    })
    </script>
  • 이렇게 하면 실패한다
  • 메세지를 잘 읽어보면 A서버의 헤더에서 ‘Access-Control-Allow-Origin’헤더를
    발견할 수 없어서 해당 오리진B는 A에 접속할 수 없다고 나온다
  • 통신하기 위해선 이 헤더가 존재해야하고 헤더 안의 정보와 B가 매칭이 되어야 실제
    요청을 보내게 된다
  • 이를 설정하기 위해선 간단하다
@SpringBootApplication
@RestController
public class Bootdemo4colsApplication {

    //CORS 설정
    @CrossOrigin(origins = {"http://localhost:180180","/그외 가능/"})
    @GetMapping("/hello")
    public String hello() {return "hello";}

    public static void main(String[] args) {
        SpringApplication.run(Bootdemo4colsApplication.class, args);
    }
}
  • 설명
    • 토이 프로젝트라 따로 컨트롤러 만들지 않고 바로 RestController설정
    • @CrossOrigin에 설정이 가능하며 여러개도 설정 가능
    • Origin을 이루는 3가지가 맞도록 잘 설정
    • 이제 A프로젝트를 다시 띠운후 B프로젝트에 매핑된 html을 요청하면
      Ajax요청이 성공하여서 “hello”메세지를 가진 alert창이 뜨게된다
    • 예제에서는 핸들러에 @CrossOrigin을 하였지만 컨트롤러 클래스에 붙여서
      해당 컨트롤러 전체 적용이 가능하다
    • 만약 전역적으로 하고 싶다면?
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/hello")
                .allowedOrigins("http://localhost:10080");
    }
}

Related POST

공유하기