Ana Karargâh Neler Yapıyoruz?
Hikayemizin Perde Arkası Beyin Kıvılcımları Bağlantıya Geçin

API Güvenliği: Throttling, Sürüm Kontrolü ve Doğrulama

Merhaba değerli okuyucular! Bugün, modern web uygulamalarının vazgeçilmez bir parçası olan API'lerin güvenliğini artırmak için kullanılan üç önemli tekniği inceleyeceğiz: Throttling, Sürüm Kontrolü ve Doğrulama. Bu teknikleri doğru bir şekilde uygulamak, API'lerinizin güvenliğini, performansını ve kullanılabilirliğini önemli ölçüde artıracaktır. Hadi başlayalım!

1. API Throttling

API throttling, belirli bir zaman diliminde bir kullanıcı veya IP adresinden gelen istek sayısını sınırlandırma tekniğidir. Bu, API'nizin aşırı kullanımını önler ve DoS (Denial of Service) saldırılarına karşı koruma sağlar.

Throttling Uygulaması:


const express = require('express');
const rateLimit = require('express-rate-limit');

const app = express();

const apiLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 dakika
    max: 100, // Her IP için 15 dakikada maksimum 100 istek
    message: 'Too many requests from this IP, please try again after 15 minutes'
});

// Tüm API rotalarına rate limiter uygula
app.use('/api/', apiLimiter);

app.get('/api/data', (req, res) => {
    res.json({ message: 'API data' });
});

app.listen(3000, () => console.log('Server running on port 3000'));

Throttling Best Practices:

  • Farklı endpoint'ler için farklı limit politikaları belirleyin
  • Rate limit bilgilerini response header'larında gönderin
  • Aşım durumunda kullanıcıya bilgilendirici mesajlar verin
  • Whitelist mekanizması ile güvenilir kaynaklara daha yüksek limitler tanımlayın

2. API Sürüm Kontrolü

API sürüm kontrolü, API'nizde yapılan değişikliklerin mevcut istemcileri etkilemeden yeni özellikler eklemenizi sağlar. Bu, geriye dönük uyumluluğu korurken API'nizi geliştirmenize olanak tanır.

Sürüm Kontrolü Uygulaması:


const express = require('express');
const app = express();

// v1 API
app.get('/api/v1/users', (req, res) => {
    res.json({ users: ['John', 'Jane'] });
});

// v2 API
app.get('/api/v2/users', (req, res) => {
    res.json({ users: [{ name: 'John', age: 30 }, { name: 'Jane', age: 25 }] });
});

app.listen(3000, () => console.log('Server running on port 3000'));

Sürüm Kontrolü Best Practices:

  • Semantic Versioning (SemVer) kullanın
  • Büyük değişiklikler için yeni bir major versiyon çıkarın
  • Eski versiyonlar için destek süresini belirleyin ve duyurun
  • API değişiklik loglarını tutun ve paylaşın
  • Versiyon bilgisini URL, header veya parametre olarak alın

3. API Doğrulama

API doğrulama, API'nize gelen isteklerin güvenilir kaynaklardan geldiğinden ve geçerli olduğundan emin olmanızı sağlar. Bu, API key'ler, token'lar veya diğer kimlik doğrulama mekanizmaları ile gerçekleştirilebilir.

Doğrulama Uygulaması:


const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

// Middleware for JWT verification
function verifyToken(req, res, next) {
    const bearerHeader = req.headers['authorization'];
    if (typeof bearerHeader !== 'undefined') {
        const bearer = bearerHeader.split(' ');
        const bearerToken = bearer[1];
        jwt.verify(bearerToken, 'your_secret_key', (err, authData) => {
            if (err) {
                res.sendStatus(403);
            } else {
                req.authData = authData;
                next();
            }
        });
    } else {
        res.sendStatus(401);
    }
}

// Protected route
app.get('/api/protected', verifyToken, (req, res) => {
    res.json({ message: 'This is a protected route', user: req.authData });
});

// Login route to get a token
app.post('/api/login', (req, res) => {
    // Here you should verify user credentials
    const user = { id: 1, username: 'john' };
    jwt.sign({ user }, 'your_secret_key', { expiresIn: '1h' }, (err, token) => {
        res.json({ token });
    });
});

app.listen(3000, () => console.log('Server running on port 3000'));

Doğrulama Best Practices:

  • HTTPS kullanın
  • Token'ları güvenli bir şekilde saklayın ve iletin
  • Token'lara kısa ömür (expiration time) verin
  • Refresh token mekanizması kullanın
  • Hassas verilere erişim için ek doğrulama adımları ekleyin
  • API key'leri düzenli olarak değiştirin

Kapsamlı API Güvenlik Yönetimi

Bu üç tekniği bir araya getiren kapsamlı bir API güvenlik yönetimi sınıfı örneği:


const express = require('express');
const rateLimit = require('express-rate-limit');
const jwt = require('jsonwebtoken');

class APISecurityManager {
    constructor(app) {
        this.app = app;
        this.setupThrottling();
        this.setupVersioning();
        this.setupAuthentication();
    }

    setupThrottling() {
        const apiLimiter = rateLimit({
            windowMs: 15 * 60 * 1000,
            max: 100,
            message: 'Too many requests, please try again later.'
        });
        this.app.use('/api/', apiLimiter);
    }

    setupVersioning() {
        this.app.use('/api/v1', this.createV1Routes());
        this.app.use('/api/v2', this.createV2Routes());
    }

    setupAuthentication() {
        this.app.use('/api', this.verifyToken);
    }

    createV1Routes() {
        const router = express.Router();
        router.get('/users', (req, res) => {
            res.json({ users: ['John', 'Jane'] });
        });
        return router;
    }

    createV2Routes() {
        const router = express.Router();
        router.get('/users', (req, res) => {
            res.json({ users: [{ name: 'John', age: 30 }, { name: 'Jane', age: 25 }] });
        });
        return router;
    }

    verifyToken(req, res, next) {
        const bearerHeader = req.headers['authorization'];
        if (typeof bearerHeader !== 'undefined') {
            const bearer = bearerHeader.split(' ');
            const bearerToken = bearer[1];
            jwt.verify(bearerToken, 'your_secret_key', (err, authData) => {
                if (err) {
                    res.sendStatus(403);
                } else {
                    req.authData = authData;
                    next();
                }
            });
        } else {
            res.sendStatus(401);
        }
    }

    generateToken(user) {
        return jwt.sign({ user }, 'your_secret_key', { expiresIn: '1h' });
    }
}

// Usage
const app = express();
const apiManager = new APISecurityManager(app);

app.post('/login', (req, res) => {
    // Verify credentials here
    const user = { id: 1, username: 'john' };
    const token = apiManager.generateToken(user);
    res.json({ token });
});

app.listen(3000, () => console.log('Server running on port 3000'));

Bu sınıf, throttling, sürüm kontrolü ve doğrulama mekanizmalarını tek bir yerde yönetmenizi sağlar. Böylece API güvenliğinizi daha kolay yönetebilir ve güncelleyebilirsiniz.

API güvenliği, modern web uygulamalarının kritik bir bileşenidir. Throttling, sürüm kontrolü ve doğrulama gibi teknikler uygulayarak, API'lerinizi kötüye kullanıma karşı koruyabilir, geriye dönük uyumluluğu sağlayabilir ve yetkisiz erişimleri engelleyebilirsiniz. Bu teknikleri doğru bir şekilde uygulamak, API'lerinizin güvenliğini, performansını ve kullanılabilirliğini önemli ölçüde artıracaktır.

Siz API güvenliği için hangi teknikleri kullanıyorsunuz? Karşılaştığınız zorluklar veya paylaşmak istediğiniz ek öneriler var mı? Yorumlarınızı bekliyorum!

Güvenli kodlamalar ve güvenli API'ler dilerim!