4xx Client Error

403 Forbidden

What it means

The server understood the request, knows who the client is (or doesn't need to), but will not allow the action. Unlike 401, re-authenticating won't help — the client simply doesn't have permission. The difference: 401 is "who are you?", 403 is "I know who you are, but you can't have this."

Site Visitor

What can I do?

  • If you believe you should have access, contact the site owner.
  • Try logging in — sometimes 403 appears when authentication is needed.
  • Check if you're trying to access a page that requires a specific role (admin, subscriber, etc.).
Developer

How to debug & fix

  1. Return 403 when authenticated but not authorized — not 401
  2. Consider returning 404 instead of 403 to hide the existence of private resources from unauthorized users
  3. Log all 403s to spot potential security probing
  4. Check file/directory permissions on the server (chmod issues)
  5. Log 403s per user to detect probing or privilege escalation attempts.

Code Example

Node.js / Express
const authorize = (role) => (req, res, next) => {
  if (!req.user.roles.includes(role)) {
    return res.status(403).json({
      error: 'Forbidden',
      message: 'Insufficient permissions'
    });
  }
  next();
};

Related Status Codes

How HTTP Status Codes Work

Every HTTP response carries a three-digit status code that tells the client — browser, API consumer, or search-engine crawler — exactly what happened. The first digit defines the class: 1xx informational (request in progress), 2xx success, 3xx redirection, 4xx client error (bad request, missing auth, not found), and 5xx server failure.

Status codes are standardised in RFC 9110 (HTTP Semantics, 2022). Extensions like WebDAV (RFC 4918) and rate-limit headers (RFC 6585) added codes beyond the core set. When a client receives an unrecognised code, the rule is to treat it as the generic x00 of its class.

Why the Right Code Matters

Semantically correct codes help search engines index accurately (301 passes link equity; 410 removes pages faster than 404), allow API clients to implement correct retry logic (429 + Retry-After, 503 + Retry-After), and let monitoring systems distinguish bugs (500) from load issues (503) from auth failures (401/403).

Looking up a different status code? The full reference covers all HTTP codes with causes, fix guides, and copyable code examples for Node.js and Python.

Browse the full HTTP Status Code reference →

Frequently Asked Questions

What does HTTP 403 Forbidden mean?
The server understood the request, knows who the client is (or doesn't need to), but will not allow the action. Unlike 401, re-authenticating won't help — the client simply doesn't have permission. The difference: 401 is "who are you?", 403 is "I know who you are, but you can't have this."
Is HTTP 403 the visitor's fault?
HTTP 403 Forbidden is generally a client-side error, meaning the request itself has an issue. However, many causes — such as a broken link on the site or a misconfigured redirect — are the website owner's responsibility, not the visitor's.
How do I fix HTTP 403 Forbidden?
As a visitor: check the URL for typos, go to the homepage, or search for the content. As a developer: return 403 when authenticated but not authorized — not 401.