프런트엔드 애플리케이션은 정적 사이트이며 http://web.xxx.com 도메인에 배포됩니다. 백엔드 애플리케이션은 REST API를 게시하고 http://api.xxx.com에 배포됩니다. domain.프런트 엔드 애플리케이션이 AJAX를 통과하도록 만드는 방법 백엔드 애플리케이션에 대한 도메인 간 액세스는 어떻습니까? 이를 위해서는 현재 최고의 솔루션인 CORS 기술을 사용해야 합니다.
[CORS는 Cross Origin Resource Sharing(교차 도메인 리소스 공유)을 의미합니다. 서버는 클라이언트가 AJAX 교차 도메인 요청을 실행할 수 있도록 관련 응답 헤더 정보만 추가하면 됩니다. ]
CORS 기술은 매우 간단하고 구현하기 쉽습니다. 현재 대부분의 브라우저는 이 기술을 지원합니다(IE8 브라우저도 지원함). 서버는 CORS에 응답할 수 있는 한 모든 프로그래밍 언어를 통해 구현될 수 있습니다. 응답 객체에 헤더를 작성하기만 하면 됩니다.
다음으로 우리는 REST 프레임워크를 계속 확장하고 CORS 기술을 통해 AJAX 도메인 간 액세스를 구현합니다.
먼저 모든 HTTP 요청을 필터링하는 필터를 작성하고 CORS 응답 헤더를 응답 개체에 작성해야 합니다.
public class CorsFilter implements Filter { private String allowOrigin; private String allowMethods; private String allowCredentials; private String allowHeaders; private String exposeHeaders; @Override public void init(FilterConfig filterConfig) throws ServletException { allowOrigin = filterConfig.getInitParameter("allowOrigin"); allowMethods = filterConfig.getInitParameter("allowMethods"); allowCredentials = filterConfig.getInitParameter("allowCredentials"); allowHeaders = filterConfig.getInitParameter("allowHeaders"); exposeHeaders = filterConfig.getInitParameter("exposeHeaders"); } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; if (StringUtil.isNotEmpty(allowOrigin)) { List<String> allowOriginList = Arrays.asList(allowOrigin.split(",")); if (CollectionUtil.isNotEmpty(allowOriginList)) { String currentOrigin = request.getHeader("Origin"); if (allowOriginList.contains(currentOrigin)) { response.setHeader("Access-Control-Allow-Origin", currentOrigin); } } } if (StringUtil.isNotEmpty(allowMethods)) { response.setHeader("Access-Control-Allow-Methods", allowMethods); } if (StringUtil.isNotEmpty(allowCredentials)) { response.setHeader("Access-Control-Allow-Credentials", allowCredentials); } if (StringUtil.isNotEmpty(allowHeaders)) { response.setHeader("Access-Control-Allow-Headers", allowHeaders); } if (StringUtil.isNotEmpty(exposeHeaders)) { response.setHeader("Access-Control-Expose-Headers", exposeHeaders); } chain.doFilter(req, res); } @Override public void destroy() { } }
위의 CorsFilter는 다음과 같습니다. 웹에서 사용 .xml에서 관련 필터 초기화 매개변수를 읽고, HTTP 요청을 처리할 때 해당 CORS 응답 헤더에 이러한 매개변수를 씁니다. 다음은 이러한 CORS 응답 헤더의 의미를 간략하게 설명합니다.
Access-Control-Allow-Origin: 접근이 허용된 클라이언트 도메인 이름입니다. 예: http://web.xxx.com *인 경우 접근이 가능하다는 의미입니다. 즉, 어떤 도메인에서도 가능합니다.
Access-Control-Allow-Methods: 액세스를 허용하는 메서드 이름입니다. 여러 메서드 이름은 GET, POST, PUT, DELETE, OPTIONS와 같이 쉼표로 구분됩니다.
Access-Control-Allow-Credentials: 확인 정보가 포함된 요청을 허용할지 여부. 클라이언트 도메인에서 쿠키를 얻으려면 true로 설정해야 합니다.
Access-Control-Allow-Headers: 서버 액세스를 허용하는 클라이언트 요청 헤더입니다. 여러 요청 헤더는 쉼표로 구분됩니다(예: Content-Type).
Access-Control-Expose-Headers: 클라이언트 액세스를 허용하는 서버 응답 헤더는 쉼표로 구분됩니다.
CORS 사양에서는 Access-Control-Allow-Origin이 * 또는 특정 도메인 이름 중 두 가지 값만 허용한다고 정의합니다. 즉, 동시에 여러 도메인 이름을 구성하는 것은 허용되지 않습니다. 지원됩니다. 여러 도메인에 걸쳐 문제를 해결하려면 코드에서 일부 처리를 수행해야 합니다. 여기서 필터 초기화 매개변수는 도메인 이름 모음(쉼표로 구분)으로 사용됩니다. 현재 요청에서 Origin 요청 헤더를 가져옵니다. 요청이 위에서 허용된 도메인 이름 집합에 있는 경우 Access-Control-Allow-Origin 응답 헤더에 포함되므로 여러 도메인을 교차하는 문제를 쉽게 해결할 수 있습니다.
다음은 web.Stateful에서 CorsFilter를 구성하는 방법입니다. 백엔드 애플리케이션에서 게시한 REST API는 사용자가 로그인하지 않고도 임의로 호출할 수 있습니다. 이 문제를 어떻게 해결해야 할까요? REST 요청에 대한 보안 메커니즘을 제공해야 합니다.