API Security: Do Not Trust the Client

The frontend can hide buttons, disable fields, and guide the user through the right flow, but anything that comes from the client can be changed. Attackers swap IDs in URLs, edit payloads, call the API directly, and bypass the UI completely. Real security lives in the backend: authentication, authorization, object-level access checks, input validation, rate limits, and logging on every request, because every request is treated as possibly manipulated.
A common mistake in application security is trusting the client too much.
The frontend can improve the user experience, hide buttons, disable fields, and guide the user through the right flow. But it should never be treated as the security layer.
Anything that comes from the client can be changed.
A user can modify a request, call the API directly, change an ID in the URL, edit a payload, bypass the UI, or send values the frontend was never supposed to allow.
This is why real security must happen in the backend.
The backend should validate every request, check authentication, enforce authorization, and make sure the user is allowed to access the specific object they are asking for.
It is not enough to know that the user is logged in.
The backend must also ask:
- Can this user access this specific record?
- Can this user perform this specific action?
- Does this value make sense?
- Is this request too frequent?
- Is the payload valid?
- Should this action be logged?
For example, a user may be allowed to view their own ticket. But they should not be able to view someone else's ticket just by changing the ticket ID in the request.
Good API security should include backend-side validation, object-level authorization, input sanitization, rate limiting, clear error handling, logging, monitoring, and protection against abuse.
The client can help the user.
But the backend must enforce the rules.
A secure API assumes that every request can be manipulated and checks it before trusting it.

Certificate Expiration Is Still Taking Systems Down
An expired certificate is one of the simplest, most preventable outages, and it still keeps happening. The fix is not heroics on renewal day. It is treating certificates like production assets: a real inventory, a clear owner, monitored expirations, alerts, a renewal process, automation where possible, and post-renewal testing so the change does not break something downstream.
Read article
GraphQL: Powerful, Flexible, and Easy to Misuse
GraphQL gives clients a clean way to ask for exactly the data they need from a single endpoint. That same flexibility is also what makes it easy to over-expose. Without field-level authorization, query depth and complexity limits, rate limiting, logging, and a real schema review process, one badly shaped query can return information a user should never see, or quietly knock the backend over.
Read article