Standard controller, custom controller, or an extension?
Testing What you say about security. The three options differ there and the answer usually skips it.
A standard controller when the page works with one record and I want the
built-in behaviour — save, edit, delete, cancel all come free, and
it enforces the user's access to the record. A custom controller when the
page is not tied to one record and I am writing the logic myself. An
extension when I want the standard controller's behaviour plus a few methods
of my own.
The functional split is straightforward and the security difference is the
one worth stating. A standard controller respects the running user's sharing
and field access, because the platform is doing the record access. A custom
controller runs in system mode unless I declare with sharing, so a page
built on one will happily show a record the user has no right to see —
that is not a bug in the page, it is the default, and it is why an extension
on a standard controller is often the safer shape for a record page. The
other practical reason to prefer the standard controller where I can is that
it manages the record's state for me, so there is less in the view state and
fewer ways to get the save semantics wrong.
They'll ask next Does with sharing on a custom controller cover field access too?
No. It covers record sharing only, so field level security still needs handling — the same gap as any Apex class.
They'll ask next Can a page have two extensions?
Yes, comma-separated, and the first one wins where methods collide. Which is a good reason to keep them from overlapping.