Как лучше сделать закрытое REST API?
CORS не имеет ничего общего с API. Т.к. это - браузерная технология и используется для скриптов внутри браузеров.Простой принцип разделения:
1. Для всех - список параметров без ключа.
2. Для себя - список параметров с неким ДИНАМИЧЕСКИМ ключом (токен подписи) и формулой его генерации, которая известна только Вам.Теперь, защита от перехвата (лучше делать, даже если есть SSL):
1. На сервере храним формулу генерации подписи запроса на основе входных параметров запроса к API и временной метки.
2. При обращении к функциям "закрытого" API (для личных целей) Вы формируете подпись запроса, предварительно СИНХРОНИЗИРУЯ время с серверным, и затем, согласно формуле, отсылаете на сервер.
3. Сервер, зная формулу делает тоже самое и сверяет значения присланной и полученной (по той же формуле на стороне сервера) подписи: если они не совпадают ИЛИ просрочена ИЛИ это дубликат - сервер запрос к API отклоняет, иначе - запрос исполняется.
4. Сервер кэширует запрос на время погрешности синхронизации, чтобы предотвратить повторное использование идентичного запроса посредством MiTM-перехвата.
Вам нужно смотреть в сторону OAuth авторизации (не путать с аутентификацией).
CORS вряд ли вам поможет. Так как он дает привелегии для доменов, а не для пользователей.