CORS v praxi: Prečo je blokovaný prístup k vašej REST službe a ako to vyriešiť

1. Základné vysvetlenie CORS (Cross-Origin Resource Sharing)

CORS je bezpečnostný mechanizmus v prehliadačoch, ktorý zabraňuje webovým aplikáciám robiť požiadavky na iný server, než z ktorého boli načítané. Ak sa frontend (napr. Angular) pokúsi zavolať API z iného pôvodu (origin), prehliadač požiadavku zablokuje – ak API neodpovie s povolením.

Príklad: Vaše Angular UI beží na http://localhost:4200, ale REST API na http://localhost:8080. Ide o tzv. cross-origin request, ktorý musí byť schválený cez CORS hlavičky.

2. Nastavenie hlavičiek Access-Control-Allow-* v Java EE kontejnere

Riešením je odpovedať na požiadavku správnymi CORS hlavičkami, napríklad:

Access-Control-Allow-Origin: http://localhost:4200
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type

V Java EE kontejnere môžete nastaviť CORS pomocou filtra:

@Provider
public class CORSFilter implements ContainerResponseFilter {
  @Override
  public void filter(ContainerRequestContext request, ContainerResponseContext response) {
    response.getHeaders().add("Access-Control-Allow-Origin", "*");
    response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS");
    response.getHeaders().add("Access-Control-Allow-Headers", "Content-Type, Authorization");
  }
}

Pre väčšiu bezpečnosť namiesto "*" použite konkrétny pôvod.

3. Bezpečnostné obmedzenia: Kedy je lepšie zvoliť iné riešenie ako CORS

Aj keď je CORS štandardný spôsob, niekedy je lepšie použiť:

CORS by mal byť dočasné riešenie pri vývoji, nie produkčné obchádzanie politiky pôvodu.

4. Riešenie bežných chýb (OPTIONS request, preflight, credentials)

Pri požiadavkách s hlavičkami (napr. Authorization) prehliadač najprv odošle tzv. OPTIONS preflight request. Ak vaša služba na túto požiadavku neodpovie správne, hlavný request bude zablokovaný.

Najčastejšie chyby:

Pridajte OPTIONS handler alebo použite framework, ktorý ho podporuje (napr. Jersey, Spring Boot).

5. Príklad konfigurácie v Tomcat, Spring Boot a iných servlet kontajneroch

Tomcat: môžete pridať CORS filter do web.xml alebo ako servlet filter v kóde.

Spring Boot:

@Bean
public WebMvcConfigurer corsConfigurer() {
  return new WebMvcConfigurer() {
    public void addCorsMappings(CorsRegistry registry) {
      registry.addMapping("/api/**")
              .allowedOrigins("http://localhost:4200")
              .allowedMethods("GET", "POST", "PUT", "DELETE");
    }
  };
}

Jersey: použite ContainerResponseFilter (ako vyššie).

Chcete sa naučiť, ako správne nastaviť CORS a REST API v praxi?

Všetky tieto kroky si môžete osvojiť v kurze Java REST služby s Hibernate, kde vytvoríte kompletnú REST službu, pripojíte ju na databázu a zabezpečíte komunikáciu s frontendom v Angulari.

Ako začať programovať?

Úvod do programovania pre každého bez prechádzajúcich znalostí.

Stiahnite si náš ebook teraz výnimočne zdarma!!!

Viac informacií preberáme na kurze:

Kurz JAVAEEREST - Java REST - RESTful Web Services s Hibernate

Marián Knězek

 

Súvisiace články: