Source of truth: SecurityConfig.securityFilterChain().
POST /auth/registerPOST /auth/loginPOST /auth/refreshGET /auth/jwksGET /jwksGET /auth/.well-known/openid-configuration/oauth2/**
/swagger-ui/**/swagger-ui.html/v3/api-docs/v3/api-docs/**/swagger-resources/**/webjars/**/favicon.ico
/ws/ws/**/ws-notifications/ws-notifications/**
Notes:
- These are HTTP handshake paths allowed at URL filter level.
- Message-level authorization still applies in WebSocket security configuration.
OPTIONS /**(CORS preflight)GET /actuator/healthGET /actuator/info/error
- Default rule:
anyRequest().authenticated(). - Non-health/info actuator endpoints:
ROLE_ADMINrequired. - Domain endpoints (
/projects/**,/boards/**,/tasks/**,/users/**,/friends/**,/chat/**,/notifications/**) require authenticated access, with additional service-level ownership/membership checks where applicable.
- Missing/invalid token on protected endpoint:
401 Unauthorized - Authenticated but denied by role/ownership/membership rules:
403 Forbidden - Resource cannot be resolved for caller scope in some service flows:
404 Not Found