Berk Akademi
Ana Sayfa
ÖZEL KODLAMA DERSLERİ
Yazılım Özel Ders
Tüm birebir programlara genel bakış
Python Yazılım Kursu
Sıfırdan ileri seviyeye birebir Python
Java Yazılım Kursu
OOP odaklı birebir Java eğitimi
AP Computer Science Principles
AP CSP sınav hazırlığı
GRUP DERSLERİ
Python & Django Masterclass
SINIRLI KONTENJAN
Java & Spring Boot Masterclass
SINIRLI KONTENJAN
C# .NET Masterclass
SINIRLI KONTENJAN
VİDEO DERSLER
Sıfırdan Temel Python Kursu
Kendi Hızında Öğren
ÜCRETSİZ
Seviye Testi
Ücretsiz — Python, Java, algoritma seviye testleri
Kariyerini Keşfet
Sertifika Doğrula
Belge numarası ve soyad ile doğrulama

REST API'yi Canlıya Almadan Önce Kontrol Edilmesi Gereken 7 Pratik Madde

rest-api-canliya-almadan-once-kontrol-edilecek-7-madde
Bu yazıda neler var?
  1. Production Öncesi REST API Kontrolü Nasıl Sıralanmalı?
  2. 1. Ortam Değişkenleri ve Gizli Bilgiler Koddan Ayrıldı mı?
  3. 2. Hata Yönetimi Kullanıcıya Güvenli ve Tutarlı Yanıt Veriyor mu?
  4. 3. Request Body ve Parametreler Doğrulanıyor mu?
  5. 4. Rate Limiting ve İstek Sınırlama Mantığı Tasarlandı mı?
  6. 5. Loglar Hata Teşhisi İçin Yeterli, Hassas Veriler İçin Güvenli mi?
  7. 6. CORS Yapılandırması Gereğinden Fazla Geniş mi?
  8. 7. Kritik Endpoint'ler İçin Temel Testler Var mı?
  9. Yayınlamadan Önce Son Teşhis Akışı: Hangi Kontrol Önce Yapılmalı?
  10. Sık Sorulan Sorular

REST API production ortamına alınmadan önce yalnızca endpoint’lerin çalıştığını doğrulamak yeterli değildir. Güvenlik, hata davranışı, veri doğrulama, trafik kontrolü, loglama, tarayıcı erişimi ve testler birlikte incelenmelidir. En pratik yaklaşım; önce dışarıya açık güvenlik ve veri sızıntısı risklerini, ardından dayanıklılık ve teşhis edilebilirlik sorunlarını, son olarak da test eksiklerini kontrol etmektir.

Bu sıralama, ilk REST API’sini yayınlayacak bir geliştiricinin “uygulama çalışıyor mu?” sorusundan daha doğru olan “uygulama beklenmeyen durumda güvenli ve anlaşılır davranıyor mu?” sorusuna geçmesini sağlar.

Production Öncesi REST API Kontrolü Nasıl Sıralanmalı?

Kontrolü aşağıdaki yedi maddelik sırayla yürütmek, kritik riskleri erken aşamada yakalamanıza yardımcı olur. Her maddeyi yalnızca teorik olarak okumak yerine, kendi repository’niz, yapılandırmanız ve test istekleriniz üzerinden cevaplayın.

  1. Ortam değişkenleri ve gizli bilgiler: API anahtarları, veritabanı şifreleri ve imzalama anahtarları koddan, örnek yapılandırmalardan ve sürüm kontrol geçmişinden ayrıldı mı?
  2. Hata yönetimi: Beklenmeyen hatalarda istemciye stack trace veya iç sistem ayrıntıları yerine tutarlı ve güvenli bir hata yanıtı dönüyor mu?
  3. Girdi doğrulama: Request body, query parametreleri, path parametreleri ve veri türleri işlenmeden önce doğrulanıyor mu?
  4. Rate limiting: Tek bir istemcinin aşırı sayıda istek göndererek sistemi zorlamasını önleyecek bir trafik kontrolü tasarlandı mı?
  5. Loglama: Hataları teşhis etmeye yetecek bilgiler loglanırken parola, token ve kişisel veriler loglara sızmıyor mu?
  6. CORS yapılandırması: Tarayıcı erişimi yalnızca ihtiyaç duyulan origin, yöntem ve header kapsamıyla mı sınırlandırıldı?
  7. Kritik endpoint testleri: Kimlik doğrulama, yetkilendirme, geçersiz veri, bulunamayan kayıt ve beklenmeyen hata senaryoları test edildi mi?

Bu sırada ilk üç madde doğrudan veri sızıntısı ve yetkisiz işlem risklerine odaklanır. Rate limiting ve loglama, API’nin yoğunluk veya hata anında dayanıklı ve teşhis edilebilir olmasına yardımcı olur. CORS ve testler ise dış istemcilerin gerçek kullanımına daha yakın son kontrolleri oluşturur.

1. Ortam Değişkenleri ve Gizli Bilgiler Koddan Ayrıldı mı?

Bir API’yi canlıya almadan önce kaynak kodunu yalnızca derlenip çalışması açısından değil, içinde hangi bilgilerin bulunduğu açısından da inceleyin. API anahtarları, veritabanı kullanıcı adı ve şifreleri, JWT veya benzeri imzalama anahtarları, üçüncü taraf servis token’ları ve özel bağlantı bilgileri kaynak koduna sabit yazılmamalıdır.

Bu değerleri doğrudan kod dosyasına eklemek, repository erişimi olan herkesin veya yanlışlıkla paylaşılmış bir dosyanın bu sırlara ulaşabilmesine neden olabilir. Örnek yapılandırma dosyasında da gerçek değerleri kullanmak yerine yalnızca değişken adlarını ve sahte örnekleri gösterin.

Canlıya alma öncesi pratik kontrol akışı

  • Repository içinde parola, token, secret, private key ve bağlantı dizesi gibi ifadeleri arayın.
  • Örnek yapılandırma dosyasında gerçek değerler yerine açıklayıcı yer tutucular kullanıldığını kontrol edin.
  • Production ortamında gerekli değişkenlerin gerçekten tanımlı olup olmadığını uygulama başlatılmadan önce doğrulayın.
  • Eksik bir değişken olduğunda uygulamanın belirsiz bir davranış yerine anlaşılır bir başlangıç hatası verdiğinden emin olun.
  • Hata mesajlarında environment değişkenlerinin, veritabanı bağlantılarının veya imzalama anahtarlarının görünmediğini kontrol edin.
  • Gizli değerlere erişebilen kullanıcı, servis ve deployment bileşenlerini ihtiyaç duyulan en dar kapsamla sınırlandırın.

Java ve Spring uygulamalarında yapılandırmayı profile ve environment tabanlı biçimde ayırmak yaygın bir yaklaşımdır. Böylece geliştirme, test ve production ayarları aynı dosyada birbirine karışmaz. Python tarafında ise os.environ veya bunun etrafında oluşturulan ayrı bir configuration katmanı kullanılabilir. Buradaki temel fikir framework’ten bağımsızdır: kod davranışı ile ortama özel gizli değerler birbirinden ayrılmalıdır.

Kontrol sırasında yalnızca mevcut dosyalara bakmak da yeterli değildir. Daha önce commit edilmiş bir secret, sonradan dosyadan silinse bile sürüm kontrol geçmişinde kalabilir. Benzer şekilde uygulama logları, hata raporları veya terminal çıktıları da gizli değerleri taşıyor olabilir.

Kontrol kutusu: “Koddan sildim” demek, “git geçmişinden ve loglardan temizledim” demek değildir. Bir gizli değer daha önce paylaşıldıysa yalnızca satırı silmek yerine ilgili değeri geçersizleştirmek, yenisini üretmek ve eski kopyaların bulunduğu geçmişi ayrıca incelemek gerekir.

2. Hata Yönetimi Kullanıcıya Güvenli ve Tutarlı Yanıt Veriyor mu?

2. Hata Yönetimi Kullanıcıya Güvenli ve Tutarlı Yanıt Veriyor mu?

Bir endpoint çalışırken beklenmeyen bir exception oluşabilir: veritabanı bağlantısı kopabilir, beklenmeyen bir veri tipi gelebilir veya dış servis yanıt vermeyebilir. Bu durumda istemciye stack trace, dosya yolu, SQL sorgusu, tablo adı ya da gizli yapılandırma bilgisi gönderilmemelidir. Java öğrenme sürecini uygulamalı ve kişiselleştirilmiş ilerletmek isteyenler için Java özel dersi kapsamında bu tür hata akışları ayrıca çalışılabilir.

Güvenli bir hata yanıtında genellikle makinenin okuyabileceği bir hata kodu, kullanıcıya uygun kısa bir açıklama ve sunucu tarafındaki takibi kolaylaştıracak bir request veya correlation ID bulunur. İstemci bu ID’yi destek ekibine iletebilir; geliştirici ise aynı ID üzerinden logları arayabilir.

Bulunamayan kayıt için kontrollü yanıt

from flask import Flask, jsonify

app = Flask(__name__)
books = {1: {"title": "Algoritmalar"}}

@app.get("/books/<int:book_id>")
def get_book(book_id):
    try:
        book = books[book_id]
        return jsonify(data=book)
    except KeyError:
        app.logger.warning("Book not found: %s", book_id)
        return jsonify(error={"code": "BOOK_NOT_FOUND",
                              "message": "Kayıt bulunamadı"}), 404

if __name__ == "__main__":
    app.run()

/books/1 isteğinde kayıt JSON olarak döner. Örneğin /books/99 isteğinde ise Python exception ayrıntısı istemciye açılmadan, makine tarafından işlenebilir BOOK_NOT_FOUND kodu ve kullanıcıya uygun bir mesaj gönderilir. Sunucu logunda ise teşhis için kayıt numarası tutulur.

Beklenmeyen hatayı genel mesajla karşılamak

from flask import Flask, jsonify
from uuid import uuid4

app = Flask(__name__)

@app.get("/report")
def report():
    request_id = str(uuid4())
    try:
        result = 10 / 0
        return jsonify(data=result)
    except Exception:
        app.logger.exception("Unexpected error, request_id=%s", request_id)
        return jsonify(error={"code": "INTERNAL_ERROR",
                              "message": "Beklenmeyen bir hata oluştu",
                              "request_id": request_id}), 500

if __name__ == "__main__":
    app.run()

Bu örnekte istemci, hatanın teknik sebebi olan bölme işlemini veya stack trace’i görmez. Sunucu tarafındaki loglama noktası exception ayrıntısını kaydeder ve yanıt içindeki request ID ile log kaydı eşleştirilebilir. Gerçek uygulamada bu ID’nin gelen bir header’dan alınması veya response header’ına da eklenmesi tercih edilebilir; ancak ID içine gizli bilgi koyulmamalıdır.

Spring tarafında benzer yaklaşım, her controller’ın ayrı ayrı hata üretmesi yerine merkezi bir exception handling katmanı ve ortak response modeli kullanılarak uygulanır. Böylece bulunamayan kayıt, doğrulama hatası ve beklenmeyen sistem hatası farklı kodlarla fakat aynı genel JSON yapısıyla dönebilir. Amaç, istemcinin her endpoint için bambaşka hata formatlarını çözmek zorunda kalmamasıdır.

3. Request Body ve Parametreler Doğrulanıyor mu?

İstemciden gelen hiçbir veri kendiliğinden güvenilir kabul edilmemelidir. Request body içindeki JSON alanları, URL’deki path parametreleri, query parametreleri ve header değerleri; eksik, yanlış tipte, boş, aşırı uzun veya beklenmeyen biçimde gelebilir. Python ile ilerleyen okuyucular, bu kontrolleri birebir Python dersleri kapsamında kendi endpoint senaryolarına uyarlayabilir.

Doğrulamanın doğru yeri, iş katmanına geçişten öncesidir. Böylece veritabanına sorgu göndermeden, e-posta servisi çağırmadan veya sipariş oluşturmaya çalışmadan önce hatalı istek kesilir. Hata yanıtı da yalnızca “geçersiz istek” demek yerine hangi alanın neden reddedildiğini anlaşılır biçimde belirtmelidir.

Kontrol edilmesi gereken veri türleri

  • Tip kontrolü: Yaş sayısal, aktiflik değeri mantıksal, kimlik değeri beklenen biçimde olmalıdır.
  • Zorunlu alan: Kullanıcı adı veya e-posta gibi iş akışı için gerekli alanlar eksik bırakılamaz.
  • Sınır kontrolü: Yaş, metin uzunluğu, sayfa numarası ve dosya boyutu için minimum-maksimum değerler belirlenmelidir.
  • Boş değer: Alanın gönderilmesi ile anlamlı bir değer taşıması aynı şey değildir. "", yalnızca boşluk veya null ayrıca ele alınmalıdır.
  • Biçim kontrolü: E-posta, tarih, UUID ve benzeri alanların beklenen formata uyup uymadığı kontrol edilmelidir.
  • İlişkili alanlar: Başlangıç tarihi bitiş tarihinden sonra olamaz; parola tekrarı parolayla eşleşmelidir.

Aşağıdaki Flask örneğinde hem zorunlu alan hem de yaş ve e-posta doğrulaması yapılır. Geçerli istek başarı yanıtı üretirken hatalı istek, iş katmanına ulaşmadan açıklayıcı bir hata döndürür:

from flask import Flask, request, jsonify
import re

app = Flask(__name__)

@app.post("/users")
def create_user():
    data = request.get_json(silent=True) or {}
    errors = {}
    email = data.get("email")
    age = data.get("age")
    if not isinstance(email, str) or not re.fullmatch(r"[^@s]+@[^@s]+.[^@s]+", email):
        errors["email"] = "Geçerli bir e-posta girin."
    if not isinstance(age, int) or not 18 <= age <= 120:
        errors["age"] = "Yaş 18 ile 120 arasında olmalıdır."
    if errors:
        return jsonify({"errors": errors}), 400
    return jsonify({"message": "Kullanıcı oluşturulmaya hazır"}), 201

app.run(debug=True)

{"email":"[email protected]","age":22} gönderildiğinde sunucu 201 yanıtı verir. {"email":"yanlis","age":15} gönderildiğinde ise 400 durum kodu ve iki alanı açıklayan bir errors nesnesi döner. Production ortamında hata yanıtına stack trace veya iç servis ayrıntıları eklenmemelidir.

İkinci örnek, path ve query parametrelerinin de ayrıca doğrulanması gerektiğini gösterir. Bir parametrenin URL’de bulunması, onun doğru türde veya güvenli aralıkta olduğu anlamına gelmez:

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.get("/users/<user_id>")
def get_user(user_id):
    page = request.args.get("page", "1")
    if not user_id.isdigit() or int(user_id) <= 0:
        return jsonify({"error": "user_id pozitif bir sayı olmalıdır"}), 400
    if not page.isdigit() or not 1 <= int(page) <= 100:
        return jsonify({"error": "page 1 ile 100 arasında olmalıdır"}), 400
    return jsonify({"user_id": int(user_id), "page": int(page)})

app.run(debug=True)

Burada /users/12?page=2 kabul edilirken /users/abc?page=0 reddedilir. Java/Spring uygulamalarında benzer yaklaşım genellikle DTO üzerinde Bean Validation kuralları tanımlanıp controller katmanında uygulanır. Python tarafında ise şema/model tabanlı doğrulama veya açık if kontrolleri kullanılabilir. Hangi yaklaşım seçilirse seçilsin, kuralların dağınık ve her endpoint’te farklı yorumlanması engellenmelidir.

4. Rate Limiting ve İstek Sınırlama Mantığı Tasarlandı mı?

Rate limiting, aynı istemcinin kısa sürede aşırı sayıda istek göndererek hizmeti tüketmesini, hatalı istemci döngülerini ve bazı kötüye kullanım senaryolarını sınırlamak için kullanılır. Amaç yalnızca saldırıları engellemek değildir; yanlış yapılandırılmış bir mobil uygulamanın veya başarısız bir yeniden deneme döngüsünün sistemi zorlamasını da önlemektir.

Önce hangi endpoint’in ne kadar hassas olduğunu belirleyin. Kimlik doğrulama, arama, dosya yükleme ve genel okuma işlemleri aynı sınırlama politikasına sahip olmak zorunda değildir.

Endpoint türü Değerlendirilecek risk Limit tasarımında yaklaşım
Kimlik doğrulama Şifre denemeleri ve hesap kötüye kullanımı Kullanıcı, hesap ve istemci bağlamını birlikte değerlendirin; başarısız denemeleri ayrıca izleyin.
Arama Pahalı sorgular ve otomatik tarama Arama maliyetini, sorgu uzunluğunu ve sayfalama davranışını hesaba katın.
Dosya yükleme Bant genişliği ve depolama tüketimi Dosya boyutu, işlem süresi ve kullanıcı başına toplam yükleme davranışını kontrol edin.
Genel okuma Yoğun trafik ve gereksiz tekrarlar Önbellekleme, sayfalama ve istemcinin yeniden deneme davranışıyla birlikte değerlendirin.

İstemciyi tanımlarken yalnızca IP adresine güvenmek her durumda yeterli olmayabilir. API bir proxy veya load balancer arkasındaysa istemci adresini taşıyan header’lar, yalnızca güvenilen altyapı tarafından üretildiği doğrulanıyorsa kullanılmalıdır. Aksi durumda istemci bu değeri değiştirebilir.

Bellek tabanlı sayaçlar tek sunuculu küçük uygulamalarda başlangıç çözümü olabilir; ancak birden fazla uygulama sunucusunda her sunucunun ayrı sayaç tutması tutarsız sonuçlara yol açabilir. Dağıtık yapıda sayaçların ortak ve atomik biçimde yönetilmesi gerekir. Limit aşıldığında tüm endpoint’lerde tutarlı bir durum kodu, anlaşılır hata gövdesi ve istemcinin yeniden deneme davranışını yönlendiren güvenli bir mesaj tasarlanmalıdır.

5. Loglar Hata Teşhisi İçin Yeterli, Hassas Veriler İçin Güvenli mi?

5. Loglar Hata Teşhisi İçin Yeterli, Hassas Veriler İçin Güvenli mi?

Production logları yalnızca “hata oluştu” mesajından oluşmamalıdır. Bir sorunu inceleyebilmek için en azından zaman, endpoint, işlem sonucu, güvenli bir istek kimliği ve hata sınıfı bilinmelidir. Gerekli durumlarda işlem süresi, kullanıcı yerine anonimleştirilmiş bir kayıt anahtarı ve bağımlı servisin sonucu da eklenebilir.

Loglamanın amacı isteğin bütün içeriğini kopyalamak değildir. Şifreler, access token’lar, API anahtarları, tam ödeme bilgileri ve teşhis için gerekmeyen kişisel veriler loglanmamalıdır. Gerekli alanlar maskeleme, kısmi gösterim veya anonimleştirme ile kaydedilmelidir. Örneğin bir e-postanın tamamı yerine alan adı ya da kısa bir kayıt kimliği yeterli olabilir.

Java/Spring ve Python tarafında ortak yaklaşım

Java/Spring uygulamasında log seviyeleri ve istek bağlamı controller, servis ve hata işleyicileri arasında tutarlı tutulmalıdır. Python’da logging yaklaşımıyla aynı hedefe ulaşılır: standart çıktı yerine seviyelendirilmiş, yapılandırılmış ve istek kimliğiyle ilişkilendirilebilen kayıtlar üretmek. Başarılı istekler genellikle daha az ayrıntıyla, hatalı istekler ise hata sınıfı ve güvenli bağlamla loglanır.

Debug ayrıntıları production yanıtına taşınmamalıdır. Kullanıcıya genel ve güvenli bir hata mesajı dönerken ayrıntılı teknik bilgi yalnızca yetkili ekiplerin erişebildiği loglarda tutulmalıdır. Her log kaydını yayınlamadan önce şu beş soruyla kontrol edin:

  1. Hangi endpoint ve işlem çalıştı?
  2. İstek güvenli bir istek kimliğiyle ilişkilendirildi mi?
  3. Hata türü veya işlem sonucu anlaşılır mı?
  4. Teşhis için gereken güvenli bağlam mevcut mu?
  5. Şifre, token, anahtar ve gereksiz kişisel alanlar maskelendi mi?

6. CORS Yapılandırması Gereğinden Fazla Geniş mi?

CORS, özellikle tarayıcıdan yapılan farklı origin isteklerinde API’ye hangi istemcilerin erişebileceğini belirleyen bir erişim politikasıdır. Production ortamına geçmeden önce yalnızca “CORS çalışıyor mu?” sorusunu değil, hangi frontend origin’inin hangi method ve header kombinasyonlarıyla erişmesine izin verildiğini de netleştirmelisiniz.

Geliştirme sırasında tüm origin’lere izin vermek pratik görünebilir. Ancak bu geçici ayarın canlı yapılandırmaya taşınması, API’nin beklenmeyen web istemcilerinden gelen tarayıcı isteklerine açık kalmasına neden olabilir. Bu nedenle izin listesini, gerçekten API’yi kullanacak frontend adresleriyle sınırlandırın; kullanılmayan method ve header’ları varsayılan olarak izinli bırakmayın.

Credentials kullanılan senaryolarda kontrol daha dikkatli yapılmalıdır. Çerez, oturum bilgisi veya tarayıcı kimlik doğrulama bilgileri gönderiliyorsa, izin verilen origin seçimi gelişigüzel yapılamaz. API’nin yalnızca tanımlı ve güvenilen istemcilerden gelen isteklere yanıt vermesi gerekir. Buradaki amaç CORS’u “tamamen açmak” değil, istemci ihtiyacını doğru tarif etmektir.

Production öncesi CORS teşhis akışı

  1. Beklenen frontend origin’ini açıkça yazın. Protokol, alan adı ve gerekiyorsa port bilgisini ayrı ayrı kontrol edin.
  2. İzin verilen origin listesini bu beklentiyle karşılaştırın. Geliştirme ortamına ait adreslerin canlı ayarlarda kalıp kalmadığını inceleyin.
  3. Gerçek tarayıcı isteğini çalıştırın. Sadece Postman veya benzeri araçlarla yapılan test, tarayıcıdaki CORS davranışını tek başına doğrulamaz.
  4. İzin verilen HTTP method’larını kontrol edin. Gerçek frontend’in kullandığı method ile API’nin izin verdiği method aynı olmalıdır.
  5. Header izinlerini ayrıca inceleyin. Authorization veya özel uygulama header’ları gönderiliyorsa preflight isteğinin bu header’larla uyumlu olduğundan emin olun.
  6. Credentials kullanılıyorsa origin, çerez ve kimlik doğrulama davranışını birlikte test edin. Sadece başarılı bir GET isteğine bakmayın.
  7. Preflight isteğinin sonucunu gerçek endpoint davranışıyla karşılaştırın. Preflight başarılı görünürken asıl POST, PUT veya DELETE isteği reddediliyorsa yapılandırma tamamlanmış sayılmaz.

Spring tarafındaki Security ve CORS yapılandırması, Flask veya FastAPI tarafındaki middleware ve eklenti ayarları farklı dosyalarda bulunsa da aynı temel soruya yanıt verir: Hangi istemci gerçekten erişmeli? Bu sorunun cevabı net değilse yapılandırma teknik olarak çalışsa bile production için güvenilir değildir.

7. Kritik Endpoint'ler İçin Temel Testler Var mı?

Canlıya alma öncesinde bütün sistemi kusursuz biçimde test etmeye çalışmak, özellikle ilk projesini yayınlayan geliştirici için süreci gereksiz yere büyütebilir. Daha uygulanabilir yaklaşım, kritik endpoint’lerin temel sözleşmesini ve başarısızlık davranışını öncelikli olarak doğrulamaktır. Bir endpoint hangi girdiyi kabul ediyor, başarılı olduğunda ne döndürüyor ve hata durumunda nasıl davranıyor soruları cevaplanmalıdır.

Her kritik endpoint için en az şu durumları değerlendirin:

  • Geçerli veriyle başarılı istek
  • Eksik, yanlış türde veya hatalı biçimde gönderilmiş veri
  • Yetkisiz ya da kimlik doğrulaması eksik istek
  • Bulunamayan kaynak
  • Beklenmeyen hata veya bağımlı servis başarısızlığı
  • Endpoint ile ilgiliyse rate-limit sınırı
  • Tarayıcıdan kullanılıyorsa CORS ve preflight davranışı

Örneğin öğrenci projesindeki bir kullanıcı oluşturma endpoint’i için geçerli ad ve e-posta ile başarılı yanıtı, e-posta alanı eksik olduğunda doğrulama hatasını, aynı e-posta tekrar gönderildiğinde çakışma davranışını ve yetkisiz istekte erişim reddini kontrol edebilirsiniz. Görev listeleme endpoint’inde ise geçerli kullanıcı için liste döndürülmesi, bulunamayan kullanıcı için uygun kaynak hatası verilmesi ve kimlik doğrulaması olmayan isteğin engellenmesi temel senaryolardır.

Beklenen durum kodlarını ezberden değil, endpoint sözleşmesine göre belirleyin. Başarılı oluşturma, geçersiz girdi, kimlik doğrulama eksikliği, yetki yetersizliği ve bulunamayan kaynak birbirinden farklı durumlar olabilir. Önemli olan, aynı türdeki hataların endpoint’ler arasında tutarlı bir biçimde ele alınması ve yanıt gövdesinin istemci tarafından anlaşılabilmesidir.

Java/Spring projelerinde JUnit ve MockMvc gibi yaklaşımlar, endpoint davranışını uygulama sınırında sınamak için kullanılabilir. Python tarafında pytest ve framework’ün test client yaklaşımı benzer bir amaca hizmet eder. Test aracından bağımsız olarak her testin şu üç parçası bulunmalıdır: gönderilen istek, beklenen yanıt veya durum kodu ve başarısızlıkta korunması gereken davranış.

Test senaryolarını belirlemekte zorlanıyorsanız, endpoint sözleşmesini birlikte inceleyip öncelikli senaryoları ayırmak için özel ders randevusu seçeneğinden yararlanabilirsiniz.

Yayınlamadan Önce Son Teşhis Akışı: Hangi Kontrol Önce Yapılmalı?

Son kontrolü rastgele yapmak yerine, güvenlik ve teşhis etkisi en yüksek adımlardan başlayın. Aşağıdaki sıra, production öncesi kısa ama etkili bir son tarama olarak kullanılabilir.

  1. Gizli bilgi taraması: Repository, yapılandırma dosyaları ve örnek ortam dosyalarında parola, token, özel anahtar veya bağlantı bilgisi arayın. Başarılı sayılması için gizli bilgilerin koddan ayrıldığı ve kullanılan değerlerin güvenli yapılandırmadan geldiği görülmelidir.
  2. Hatalı girdi kontrolü: Eksik alan, yanlış veri tipi, aşırı uzun metin ve beklenmeyen değerlerle istek gönderin. Başarılı sayılması için güvenli, tutarlı ve istemcinin anlayabileceği hata yanıtı dönmelidir.
  3. İstek sınırlama denemesi: Hassas endpoint’e art arda istek göndererek sınırlandırmanın gerçekten devreye girip girmediğini inceleyin. Başarılı sayılması için sınır aşıldığında endpoint’in tanımlı biçimde yanıt vermesi ve uygulamanın kontrolsüz biçimde zorlanmaması gerekir.
  4. Log ve maskeleme kontrolü: Başarısız bir isteği yeniden çalıştırın ve loglarda istek bağlamının bulunup bulunmadığına bakın. Başarılı sayılması için hata teşhisini kolaylaştıracak bilgiler yer almalı, parola, token ve hassas kullanıcı verileri görünmemelidir.
  5. Gerçek frontend origin’iyle CORS testi: İsteği tarayıcı üzerinden gerçek istemci adresinden gönderin. Başarılı sayılması için izin verilen origin, method, header ve credentials davranışı beklenen kullanım ile aynı olmalıdır.
  6. Kritik endpoint testleri: Başarılı ve başarısız senaryoları çalıştırın. Başarılı sayılması için kritik endpoint’lerin sözleşmeye uygun yanıt verdiği, hatalı isteklerin ise güvenli ve öngörülebilir biçimde ele alındığı görülmelidir.
  7. Son yapılandırma ve geri dönüş planı: Canlı ayarlarını, aktif sürümü ve sorun çıkarsa uygulanacak geri dönüş adımlarını gözden geçirin. Başarılı sayılması için hangi yapılandırmanın yayınlandığı ve hata halinde hangi adımın izleneceği ekip tarafından biliniyor olmalıdır.
Kontrol alanı Spring yaklaşımı Flask/FastAPI yaklaşımı Ortak production sorusu
CORS Security ve CORS yapılandırmasını inceleme Middleware veya eklenti ayarlarını inceleme Hangi istemci gerçekten erişmeli?
Girdi doğrulama Request modeli ve doğrulama katmanı Şema, serializer veya route doğrulaması Geçersiz veri uygulamaya ulaşmadan reddediliyor mu?
Hata yönetimi Merkezi exception yönetimi Hata handler’ları ve ortak yanıt yapısı İstemci güvenli ve tutarlı hata alıyor mu?
Test JUnit, MockMvc ve benzeri test yaklaşımı pytest ve test client yaklaşımı Kritik başarı ve başarısızlık senaryoları çalışıyor mu?

Sık Sorulan Sorular

REST API'yi canlıya almadan önce ilk olarak hangi kontrol yapılmalı?

İlk olarak repository ve yapılandırma dosyalarında gizli bilgilerin bulunmadığını kontrol edin. Parola, token ve özel anahtarlar koddan ayrılmalı; ardından hatalı girdiler ve kritik endpoint’ler test edilmelidir.

Stack trace neden API yanıtında gösterilmemelidir?

Stack trace; dosya yolları, sınıf adları, sorgu parçaları veya kullanılan bileşenler hakkında gereksiz bilgi sızdırabilir. İstemciye güvenli ve kısa bir hata mesajı dönmeli, ayrıntılı teşhis bilgisi yalnızca kontrollü loglarda tutulmalıdır.

Rate limiting her REST API için gerekli midir?

Her endpoint’in ihtiyacı aynı değildir. Ancak giriş, parola sıfırlama, kaynak tüketen işlemler ve dışarıya açık hassas endpoint’lerde istek sınırlama değerlendirilmelidir. Karar, kötüye kullanım ve kaynak tüketimi riskine göre verilmelidir.

CORS'u tamamen açmak neden riskli olabilir?

Tüm origin’lere izin vermek, API’nin beklenmeyen web istemcileri tarafından tarayıcı üzerinden kullanılabilmesine yol açabilir. Özellikle credentials kullanılan senaryolarda izin verilen origin’ler gerçek frontend ihtiyacıyla sınırlandırılmalıdır.

Bir öğrenci projesi için hangi API testleri minimum kabul edilebilir kapsamı oluşturur?

Her kritik endpoint için en az bir başarılı istek, hatalı veya eksik girdi, yetkisiz erişim ve bulunamayan kaynak senaryosu test edilmelidir. Endpoint’in kullanımına göre beklenmeyen hata, rate-limit ve CORS davranışları da eklenmelidir.

Bu akışı tamamladığınızda canlıya alma kararını yalnızca “endpoint çalışıyor” bilgisine değil, güvenli hata davranışı, kontrollü erişim, teşhis edilebilir loglar ve ölçülmüş kritik senaryolara dayandırabilirsiniz.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin — Yazılım Geliştirici ve Eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; bugün öğrencinin seviyesine ve hedefine göre şekillenen sürdürülebilir öğrenme sistemleri tasarlıyor. 500'den fazla kişiye ezber değil, düşünerek kod yazmayı öğretti — Berk Akademi'de izlemeye değil üretmeye dayalı öğrenme kültürünü o kuruyor.

WhatsApp Hemen Ara