KVKK ve GDPR Uyumlu Web Uygulaması Geliştirme
z
zafer ak
Yazar
28 October 2025
14 dakika okuma
680 görüntülenme
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.