Sistema de Clasificacion
Como Legal Cookies clasifica cookies, storage y requests usando una base de datos local e inteligencia artificial.
El sistema de clasificacion determina la categoria, nivel de riesgo y base legal de cada elemento detectado. Utiliza un enfoque hibrido en dos fases que combina velocidad (base de datos local) con adaptabilidad (clasificacion con IA).
Fase 1: Base de datos de cookies conocidas
La primera fase consulta una base de datos local con mas de 500 patrones conocidos. Esta base incluye:
Cookies conocidas
| Patron | Servicio | Categoria |
|---|---|---|
_ga, _gid, _gat | Google Analytics | analytics |
_fbp, _fbc | Facebook Pixel | marketing |
PHPSESSID | PHP Session | strictly_necessary |
__cf_bm | Cloudflare Bot Management | strictly_necessary |
_gcl_* | Google Ads Conversion | marketing |
_hjid, _hjSession* | Hotjar | analytics |
Dominios de tracking conocidos
const KNOWN_TRACKING_DOMAINS = [
'google-analytics.com',
'googletagmanager.com',
'doubleclick.net',
'facebook.net',
'connect.facebook.net',
'bat.bing.net',
'analytics.tiktok.com',
// ... mas de 100 dominios
];Beneficios de la base de datos local
| Beneficio | Descripcion |
|---|---|
| Velocidad | Clasificacion instantanea, sin latencia de red |
| Coste cero | No consume tokens de IA |
| Consistencia | Misma clasificacion para cookies identicas |
| Confianza | Basada en documentacion oficial de los servicios |
Fase 2: Clasificacion con IA
Los elementos no reconocidos en la base de datos local pasan a la segunda fase: clasificacion mediante un modelo de lenguaje (LLM) via OpenRouter.
Prompt especializado
El modelo recibe un prompt detallado que incluye:
- Marco legal completo: Directiva ePrivacy, RGPD, LOPDGDD, jurisprudencia TJUE
- Categorias definidas: Criterios exactos para cada categoria
- Ejemplos: Casos tipicos de cada clasificacion
- Instrucciones de formato: JSON estructurado con campos obligatorios
Informacion enviada al modelo
Para cada elemento, enviamos:
{
"id": "cookie_0",
"type": "cookie",
"name": "_custom_tracking",
"domain": ".example.com",
"isThirdParty": false,
"additionalInfo": {
"path": "/",
"httpOnly": false,
"secure": true,
"sameSite": "Lax",
"hasExpiry": true
}
}Respuesta estructurada
El modelo devuelve una clasificacion estructurada:
{
"id": "cookie_0",
"category": "analytics",
"riskLevel": "medium",
"legalBasis": "consent_required",
"regulatoryNote": "Art. 5.3 Directiva ePrivacy 2002/58/CE",
"confidenceScore": 85,
"requiresConsent": true,
"explanation": "Cookie de analitica first-party...",
"knownSource": null
}Categorias de clasificacion
El sistema utiliza 5 categorias normalizadas alineadas con los estandares de la industria:
strictly_necessary
Cookies tecnicas esenciales para el funcionamiento del sitio.
| Ejemplos | Descripcion |
|---|---|
| PHPSESSID, JSESSIONID | Cookies de sesion del servidor |
| csrf_token, XSRF-TOKEN | Proteccion contra CSRF |
| __cf_bm, cf_clearance | Seguridad/WAF de Cloudflare |
| cart_id | Carrito de compra |
Base legal: Exentas de consentimiento bajo Art. 5.3 ePrivacy
functional
Cookies que mejoran la funcionalidad pero no son estrictamente necesarias.
| Ejemplos | Descripcion |
|---|---|
| language, locale | Preferencia de idioma |
| theme | Preferencia de tema claro/oscuro |
| recently_viewed | Productos vistos recientemente |
Base legal: Generalmente requieren consentimiento
analytics
Cookies de medicion y analisis de uso del sitio.
| Ejemplos | Descripcion |
|---|---|
| _ga, _gid | Google Analytics |
| _hjid | Hotjar |
| _clck, _clsk | Microsoft Clarity |
Base legal: Requieren consentimiento (excepcion Art. 22.2 LOPDGDD para analitica first-party propia)
marketing
Cookies de publicidad, perfilado y retargeting.
| Ejemplos | Descripcion |
|---|---|
| _fbp, _fbc | Facebook Pixel |
| _gcl_au | Google Ads |
| _ttp | TikTok Pixel |
Base legal: Requieren consentimiento obligatorio
unknown
Elementos que no pueden clasificarse con certeza.
Tratamiento: Se asigna riskLevel segun el contexto:
- First-party sin patron sospechoso →
low - Third-party o nombre sospechoso →
medium - Dominio de tracking conocido →
high
Niveles de riesgo
Cada elemento recibe un nivel de riesgo que indica la gravedad potencial:
| Nivel | Significado | Requiere consentimiento |
|---|---|---|
exempt | Exento por Art. 5.3 ePrivacy | No |
low | Bajo riesgo, impacto minimo | Tecnicamente si |
medium | Riesgo moderado | Si |
high | Alto riesgo, tracking activo | Si, obligatorio |
Criterios de asignacion
exempt → strictly_necessary
low → functional first-party, analytics first-party propia
medium → analytics third-party, functional third-party, unknown ambiguo
high → marketing, tracking cross-site, scripts de terceros conocidosBase legal
El campo legalBasis indica la justificacion normativa:
| Valor | Significado |
|---|---|
strictly_necessary | Exento bajo Art. 5.3 Directiva ePrivacy |
consent_required | Requiere consentimiento previo bajo RGPD/ePrivacy |
Confianza de clasificacion
El campo confidenceScore (0-100) indica la certeza de la clasificacion:
| Rango | Significado |
|---|---|
| 90-100 | Cookie conocida en base de datos |
| 70-89 | Alta confianza basada en patrones claros |
| 50-69 | Confianza moderada, requiere verificacion |
| 0-49 | Baja confianza, clasificacion tentativa |
Las clasificaciones con confianza inferior a 70 se marcan para revision manual en el informe.
Notas regulatorias
Cada clasificacion incluye una regulatoryNote que cita la normativa especifica:
Ejemplos:
- "Art. 5.3 Directiva ePrivacy 2002/58/CE - cookie de sesion exenta"
- "Art. 6(1)(a) RGPD - requiere consentimiento para analitica de terceros"
- "Art. 22.2 LOPDGDD - podria estar exenta si es analitica first-party propia sin cruce de datos"
- "STJUE Planet49 (C-673/17) - cookies de tracking requieren consentimiento activo"
Procesamiento en lote
Para optimizar el uso de la IA, los elementos desconocidos se procesan en lote:
// Agrupar elementos desconocidos
const unknownItems = items.filter(i => !isKnown(i));
// Enviar en una sola peticion
const aiClassifications = await classifyWithAI(unknownItems);
// Combinar con clasificaciones locales
const allClassifications = [
...knownClassifications,
...aiClassifications
];Esto reduce el numero de llamadas a la API y el coste total del analisis.