KVKK ve GDPR Uyumlu Web Uygulaması Geliştirme

z

zafer ak

Yazar

28 October 2025 14 dakika okuma 680 görüntülenme
KVKK ve GDPR Uyumlu Web Uygulaması Geliştirme
Veri gizliliği yasalarına uyumlu uygulama geliştirme. Consent management, data retention ve kullanıcı hakları.

Veri Gizliliği Neden Önemli?

KVKK (Türkiye) ve GDPR (Avrupa), kişisel verilerin korunmasını zorunlu kılar. Uyumsuzluk ciddi para cezalarına yol açabilir. 2025'te bu konuda daha sıkı denetimler bekleniyor.

Temel Prensipler

  • Veri Minimizasyonu: Sadece gerekli veriyi topla
  • Amaç Sınırlaması: Veriyi belirtilen amaç dışında kullanma
  • Şeffaflık: Kullanıcıyı bilgilendir
  • Güvenlik: Veriyi koru
  • Hesap Verebilirlik: Uyumu kanıtla

Consent Management

// Cookie Consent Banner
class ConsentManager {
    constructor() {
        this.consent = this.getStoredConsent();
    }

    getStoredConsent() {
        const stored = localStorage.getItem("cookie_consent");
        return stored ? JSON.parse(stored) : null;
    }

    setConsent(preferences) {
        const consent = {
            necessary: true, // Her zaman true
            analytics: preferences.analytics || false,
            marketing: preferences.marketing || false,
            timestamp: new Date().toISOString(),
            version: "1.0"
        };

        localStorage.setItem("cookie_consent", JSON.stringify(consent));
        this.applyConsent(consent);
    }

    applyConsent(consent) {
        if (consent.analytics) {
            this.loadGoogleAnalytics();
        }
        if (consent.marketing) {
            this.loadMarketingScripts();
        }
    }
}

Laravel Consent Middleware

// app/Http/Middleware/CheckConsent.php
class CheckConsent
{
    public function handle($request, Closure $next)
    {
        $consent = $request->cookie("cookie_consent");

        if (!$consent) {
            // Consent olmadan analytics tracking yapma
            config(["analytics.enabled" => false]);
        } else {
            $preferences = json_decode($consent, true);
            config([
                "analytics.enabled" => $preferences["analytics"] ?? false,
            ]);
        }

        return $next($request);
    }
}

Data Retention Policy

// app/Console/Commands/PurgeOldData.php
class PurgeOldData extends Command
{
    protected $signature = "data:purge";

    public function handle()
    {
        // 2 yıldan eski inaktif kullanıcıları anonimleştir
        User::where("last_activity_at", "<", now()->subYears(2))
            ->where("is_active", false)
            ->chunk(100, function ($users) {
                foreach ($users as $user) {
                    $user->anonymize();
                }
            });

        // 90 günden eski logları sil
        ActivityLog::where("created_at", "<", now()->subDays(90))
            ->delete();

        // 30 günden eski oturum verilerini temizle
        Session::where("last_activity", "<", now()->subDays(30))
            ->delete();

        $this->info("Eski veriler temizlendi.");
    }
}

// User Model
public function anonymize()
{
    $this->update([
        "name" => "Anonim Kullanıcı",
        "email" => "anonymized_" . $this->id . "@example.com",
        "phone" => null,
        "address" => null,
        "is_anonymized" => true,
    ]);
}

Kullanıcı Hakları API

// routes/api.php
Route::prefix("privacy")->group(function () {
    Route::get("/my-data", [PrivacyController::class, "exportData"]);
    Route::delete("/my-data", [PrivacyController::class, "deleteData"]);
    Route::put("/consent", [PrivacyController::class, "updateConsent"]);
});

// PrivacyController
public function exportData(Request $request)
{
    $user = $request->user();

    $data = [
        "profile" => $user->only(["name", "email", "created_at"]),
        "orders" => $user->orders,
        "activities" => $user->activityLogs,
    ];

    // GDPR: 30 gün içinde teslim edilmeli
    ExportUserData::dispatch($user, $data);

    return response()->json([
        "message" => "Verileriniz hazırlanıyor. E-posta ile gönderilecek."
    ]);
}

public function deleteData(Request $request)
{
    $user = $request->user();

    // Silme talebini kaydet
    DataDeletionRequest::create([
        "user_id" => $user->id,
        "requested_at" => now(),
        "status" => "pending",
    ]);

    // 30 gün bekleme süresi
    DeleteUserData::dispatch($user)->delay(now()->addDays(30));

    return response()->json([
        "message" => "Silme talebiniz alındı. 30 gün içinde işlenecek."
    ]);
}

Privacy by Design Checklist

  • Şifreleme (at rest ve in transit)
  • Access logging
  • Data anonymization
  • Consent management
  • Privacy policy sayfası
  • Cookie policy
  • Data retention policy

Sonuç

Veri gizliliği, kullanıcı güveni ve yasal uyum için kritiktir. Privacy by Design yaklaşımı ile baştan doğru temeller atın.

İlgili Yazılar