An ARIA label gives a control an accessible name when its visible text cannot. That is a narrow job, and it is used far more widely than it should be, usually to paper over markup that would have been correct with a real label element. This page is when the label is right, when it is a symptom, and how to check what a control is actually called. It is written for the developer or agency doing the work, which the charter treats as the same buyer as the business paying for it.
The first rule: use real HTML first
A button element with text between its tags already has a name. An input with a label element pointing at it already has a name. Reach for aria-label only when there is no visible text to use, which in practice means icon-only buttons and a handful of landmarks. ARIA does not change behaviour, only what is announced, so an aria-label on a div that is not focusable fixes nothing.
When aria-label is the right answer
Icon-only controls: the close button on a modal, the search magnifier, the hamburger. Also for distinguishing repeated landmarks, such as two nav elements, where each needs its own name. Keep the label to what the control does, in the words a user would say: close, search, main menu.
How to check the name a control actually has
Open the browser's accessibility inspector and read the computed name and role for the element. That is the string a screen reader will speak, and it is often not the one anybody intended: a button whose aria-label says icon-button-3 is a real and common finding, and it is invisible until somebody looks.
Questions people ask about aria labels
Is aria-label better than a visible label?
No. A visible label is better for everyone, including people who use speech control, who have to say what they see.
Does aria-label work on any element?
Only where the element has a role that supports naming. On a plain span or div it is usually ignored, which is one reason so much of it does nothing.
What about placeholder text as a label?
It is not a label: it disappears on focus and is often too low-contrast. Use a real label and keep the placeholder for an example.