Are there any reasons why I should/shouldn't use ObjectId's in my RESTful url's
Having used ObjectId
s in RESTful APIs several times, the biggest downside is really that they are very noisy in terms of having a clean URL. You'll either leave it as a HEX number, or convert it to a very large integer number, both making for a somewhat unfriendly URL:
/rest/resource/52435dbecb970072ec3a780f
/rest/resource/25459211534898951476729247759
I've added a "title" to the URL (like StackOverflow does) to make them slightly more friendly:
/rest/resource/52435dbecb970072ec3a780f/FriendlyResourceName
Of course, the "title" is ignored in software, but the user sees it and can mentally ignore the crazy ID segment.
There's very little useful that could be learned from the infrastructure by exposing them:
- Timestamp
- Machine ID
- Process ID
- Random incrementing value
Other than potentially gathering Machine IDs (which generally would indicate the number of clients creating ObjectId
s), there's not much there.
ObjectId
s aren't random, so you couldn't use them for security. You'll always need to secure the data. While they may not increment in an obvious way, it would be easy to find other resources through brute force. However, if you were using auto-incrementing IDs before, this isn't a new problem for you.
If you know you aren't creating many new documents at any given time, it might be worth using one of the patterns here to create a simpler ID. In one app I wrote, I used an auto-inc technique for some of the document IDs that were shown in URLs, and for those that were Ajax-only, I used ObjectId
s. I really wanted some URLs to be easily "typed". No form of an ObjectId
is easily typed by an end user. That's one of the strengths of MongoDB -- that you can use any _id
format you want. :)
It's wiser to use the ObjectId
s, because keeping an incrementing counter can be a bottleneck. Also, since ObjectId
contains a timestamp and is monotonic, they can be helpful in optimizing queries.
The ObjectIds
can be guessed, but since that is definitely true for incrementing IDs, I suspect you didn't rely on security through obscurity before, so that's no trouble for you.
A downside, albeit a small one, is that the creation time on your server leaks to the user, i.e. if the user is able to identify this as an ObjectId
, she can reverse-engineer the creation time of the object. That's the only potential issue I see.