Skip to content

Security Architecture

CurioPay API incorporates multiple layers of security to protect sensitive financial data and ensure user privacy.

Security Layers

flowchart TD
    subgraph "Network Security"
        direction TB
        TLS["TLS/SSL Encryption"]
        WAF["Web Application Firewall"]
        CORS["CORS Policy"]
        IPS["IP Filtering"]
    end

    subgraph "Application Security"
        direction TB
        Auth["Authentication"]
        Authz["Authorization"]
        Input["Input Validation"]
        CSRF["CSRF Protection"]
        XSS["XSS Prevention"]
        Helmet["Security Headers"]
    end

    subgraph "Data Security"
        direction TB
        Encrypt["Data Encryption"]
        Masking["Data Masking"]
        MinData["Data Minimization"]
        DataPart["Data Partitioning"]
    end

    subgraph "Infrastructure Security"
        direction TB
        SecCont["Secure Containers"]
        NetPol["Network Policies"]
        SecCtx["Security Context"]
    end

    subgraph "Operational Security"
        direction TB
        Audit["Audit Logging"]
        Monitor["Security Monitoring"]
        Updates["Regular Updates"]
        SAST["Static Analysis"]
    end

    Client -->|"Accesses"| TLS
    TLS --> WAF
    WAF --> CORS
    CORS --> IPS
    IPS --> Auth
    Auth --> Authz
    Authz --> Input
    Input --> CSRF
    CSRF --> XSS
    XSS --> Helmet
    Helmet --> Encrypt
    Encrypt --> Masking
    Masking --> MinData
    MinData --> DataPart
    DataPart --> Database

    SecCont --- Auth
    NetPol --- Input
    SecCtx --- Helmet

    Audit --- Encrypt
    Monitor --- Masking
    Updates --- MinData
    SAST --- DataPart

Authentication & Authorization Flow

sequenceDiagram
    participant User
    participant API
    participant JWTGuard as JWT Guard
    participant RolesGuard as Roles Guard
    participant ThrottleGuard as Throttle Guard
    participant Controller

    User->>API: Request with JWT
    API->>ThrottleGuard: Check rate limits

    alt Rate limit exceeded
        ThrottleGuard-->>User: 429 Too Many Requests
    else Rate limit ok
        ThrottleGuard->>JWTGuard: Validate token

        alt Invalid token
            JWTGuard-->>User: 401 Unauthorized
        else Valid token
            JWTGuard->>JWTGuard: Decode user data
            JWTGuard->>RolesGuard: Check permissions

            alt Insufficient permissions
                RolesGuard-->>User: 403 Forbidden
            else Permissions ok
                RolesGuard->>Controller: Execute request
                Controller-->>User: 200 OK with response
            end
        end
    end

Data Encryption Strategy

flowchart LR
    subgraph "Transport Layer"
        TLS["TLS 1.3"]
    end

    subgraph "Application Layer"
        JWT["JWT Encryption"]
        Payload["Payload Encryption"]
    end

    subgraph "Database Layer"
        Column["Column-level Encryption"]
        TDE["Transparent Data Encryption"]
    end

    subgraph "Key Management"
        KMS["Key Management Service"]
        Rotation["Key Rotation"]
        MasterKey["Master Keys"]
    end

    Client <--> TLS
    TLS <--> JWT
    TLS <--> Payload
    JWT --> Column
    Payload --> Column

    Column <--> KMS
    TDE <--> KMS
    KMS <--> Rotation
    KMS <--> MasterKey

Multi-Factor Authentication

sequenceDiagram
    participant User
    participant API
    participant AuthService
    participant Database

    User->>API: Login with username/password
    API->>AuthService: Validate credentials
    AuthService->>Database: Check credentials
    Database-->>AuthService: User with MFA enabled

    AuthService->>AuthService: Generate temporary token
    AuthService-->>API: MFA required + temp token
    API-->>User: Prompt for MFA code

    User->>API: Submit MFA code + temp token
    API->>AuthService: Verify MFA code
    AuthService->>AuthService: Validate OTP code

    alt Invalid MFA code
        AuthService-->>API: Authentication failed
        API-->>User: 401 Unauthorized
    else Valid MFA code
        AuthService->>AuthService: Generate JWT token
        AuthService-->>API: Authentication successful
        API-->>User: 200 OK with JWT token
    end

Audit Logging System

classDiagram
    class AuditLog {
        +id: string
        +userId: string
        +timestamp: DateTime
        +action: string
        +resourceType: string
        +resourceId: string
        +oldValues: Json
        +newValues: Json
        +ipAddress: string
        +userAgent: string
        +status: string
        +metadata: Json
    }

    class AuditService {
        +logAction(action, resource, userId)
        +logDataChange(resource, oldData, newData, userId)
        +logAuthEvent(event, userId, status)
        +queryAuditLogs(filters)
    }

    class AuditInterceptor {
        +intercept(context, next)
    }

    AuditService --> AuditLog : creates
    AuditInterceptor --> AuditService : uses

Security Controls by Data Sensitivity

flowchart TD
    subgraph "Public Data"
        PD1["Category Names"]
        PD2["Public User Profiles"]
    end

    subgraph "Internal Data"
        ID1["Aggregated Statistics"]
        ID2["System Logs"]
        ID3["Expense Amounts"]
    end

    subgraph "Sensitive Data"
        SD1["User Email"]
        SD2["Full Names"]
        SD3["Transaction Details"]
    end

    subgraph "Highly Sensitive Data"
        HSD1["Password Hashes"]
        HSD2["MFA Secrets"]
        HSD3["Payment Details"]
    end

    Public["Basic Security Controls"] --> PD1
    Public --> PD2

    Standard["Standard Security Controls"] --> ID1
    Standard --> ID2
    Standard --> ID3

    Enhanced["Enhanced Security Controls"] --> SD1
    Enhanced --> SD2
    Enhanced --> SD3

    Strict["Strict Security Controls"] --> HSD1
    Strict --> HSD2
    Strict --> HSD3

    classDef public fill:#c1e1c5
    classDef internal fill:#c4def6
    classDef sensitive fill:#ffe066
    classDef highSensitive fill:#ffb3b3

    class PD1,PD2 public
    class ID1,ID2,ID3 internal
    class SD1,SD2,SD3 sensitive
    class HSD1,HSD2,HSD3 highSensitive