Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
Spring Boot'ta CORS, tarayıcıdaki başka bir origin'den API yanıtına erişimin hangi koşullarda kabul edileceğini belirler. Spring Web MVC uygulamasında merkezi kurallar için WebMvcConfigurer kullanılabilir. CORS, API'nin kimlik doğrulamasının veya yetkilendirmesinin yerine geçmez.

MVC için merkezi yapılandırma​


Aşağıdaki geliştirme örneği, http://localhost:3000 origin'inden gelen /api/** istekleri içindir. Origin; protokol, ana makine adı ve porttan oluşur, sonuna sayfa yolu eklenmez. Dosyayı CorsConfig.java adıyla uygulamanın bileşen taramasına giren pakete koyun. Örneğin ana uygulama sınıfı com.example.demo paketindeyse bu paket veya altı uygundur.

Kod:
package com.example.demo;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://localhost:3000")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("Content-Type", "Authorization")
                .allowCredentials(false)
                .maxAge(3600);
    }
}

Bu örnek bir API uç noktası oluşturmaz; eşleşen mevcut controller'ların CORS kuralını tanımlar. WebFlux kullanan reaktif uygulamada MVC yapılandırıcısı kullanılmaz. Üretimde localhost yerine gerçek istemci origin'ini açıkça yazın.

Ayarları ihtiyaca göre daraltma​


AyarÖrnekteki kapsamNe zaman değişir?
Yol/api/**Yalnız dış istemciye açılan API yolları için
Originhttp://localhost:3000İstemcinin protokolü, alan adı veya portu değişirse
Metot/başlıkGET, POST, PUT, DELETE; Content-Type, AuthorizationGerçek istemci isteğinin gereksinimine göre
Kimlik bilgisiallowCredentials(false)Tarayıcının çerez gibi kimlik bilgilerini taşıması gerekiyorsa güvenlik değerlendirmesiyle

allowedMethods, preflight isteğinin Access-Control-Request-Method başlığında sorduğu gerçek metotları sınırlar. Listeye yalnız OPTIONS eklemek, POST isteğini veya güvenlik filtrelerinin preflight'ı kabul etmesini sağlamaz. Spring, uygun CORS yapılandırmasında preflight yanıtını işler.

allowCredentials(true) gerekiyorsa allowedOrigins("*") kullanmayın; güvenilen origin'leri açıkça belirtin. Authorization başlığını elle göndermek ile tarayıcının credential modu aynı ayar değildir. Bu başlığın ön istekte izin verilen başlıklardan olması ve sunucunun token'ı ayrıca doğrulaması gerekir.

Spring Security ile birlikte kullanma​


Preflight çoğu zaman oturum çerezi taşımadığından CORS, güvenlik denetiminden önce işlenmelidir. MVC mevcutsa ve ayrı bir CorsConfigurationSource tanımlamıyorsanız Security, MVC CORS kurallarını kullanabilir.

Mevcut SecurityFilterChain oluşturduğunuz metotta, kendi yetkilendirme ve CSRF kurallarınızı koruyarak CORS'u etkinleştirin. Aşağıdaki bir entegrasyon parçasıdır, tek başına tam sınıf değildir:

Kod:
import static org.springframework.security.config.Customizer.withDefaults;

// Mevcut HttpSecurity yapılandırmanız içinde:
http.cors(withDefaults());

Birden fazla güvenlik zinciri veya özel CORS kaynağı varsa eşleşen zincirin kullandığı kuralları ayrıca kontrol edin. Sorunu çözmek için tüm istekleri herkese açmayın veya CSRF korumasını gelişigüzel kapatmayın.

Ön isteği ve gerçek isteği ayrı doğrulama​


Uygulamanızdaki gerçek bir yol için örnek ön istek:

Kod:
curl -i -X OPTIONS http://localhost:8080/api/users -H "Origin: http://localhost:3000" -H "Access-Control-Request-Method: POST" -H "Access-Control-Request-Headers: content-type,authorization"

Windows PowerShell'de curl başka bir komuta takma adsa kurulu gerçek istemciyi curl.exe ile çağırın. İzin verilen origin, metot ve başlıkların yanıtla karşılandığını inceleyin. Ardından aynı origin'den tarayıcıyla gerçek isteği deneyin. Bu komut örnektir; burada çalışan bir uç nokta veya ölçülmüş başarı iddiası yoktur.

Yanıtta beklenen CORS başlıkları yoksa sırayla URL eşleşmesini, origin yazımını, bileşen taramasını ve Security zincirini inceleyin. curl yanıtı gösterebilir; tarayıcı gibi CORS engellemesi uygulamaz.

Sık sorulan sorular​


CORS doğruyken POST neden 403 dönebilir?​


İstek kimlik doğrulaması, yetkilendirme veya CSRF denetiminde reddedilebilir. Ön isteğin başarılı olması gerçek işlemi yetkilendirmez. Sunucu kaydından reddin hangi katmanda oluştuğunu belirleyip o kuralı düzeltin.

Origin listesi API'ye dışarıdan erişimi tamamen engeller mi?​


Hayır. Tarayıcı dışındaki istemciler CORS kısıtlamasına tabi değildir ve Origin başlığını kendileri gönderebilir. Hassas API işlemlerini sunucu tarafında yetkilendirme ve uygun diğer erişim kontrolleriyle koruyun.
 
Son düzenleme:

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic