The big things to address are:
- non-repudiation: the user should be unable to deny that the actions are theirs. That means that the identity cannot be easily stolen by someone, and that the token provided can be validated that it is correct.
- auditable: you need to be able to determine if any users are behaving badly, and terminate access if so.
- controllable: that means that you can impose rate limits, reduce access privileges if necessary, etc.
- enforceable: or the authorization for a user to be able to perform an action is enforced.
To that end, there are multiple layers, and each of those technologies have a portion of the whole security posture in place. The good thing about OAuth is that it is standards based, making it easier for systems to build integrations. However, you can provide all those guarantees without using it if you really don't want to.
The API Key
By itself, the API key can be easily sniffed out and stolen if you don't use encrypted communications. That said, blindly using an API key also isn't the right solution. It's easy, but if there is any layer in the communications which exposes the key, it's also easy to impersonate.
At the very least you want to make sure that your API key is verifiable. OAuth does this by supplying the external system with a client id, and a secret key. There are specific rules for providing the client id and secret key, including the rule to encrypt communications.
With OAuth, the keys provided by the external system are used to negotiate a session token. The session token is then provided in the Authentication
HTTP header as a bearer token. Nine times out of ten, the session token is JWT.
OAuth2
OAuth provides a very robust foundation to verify the end user, and provide a limited use session token for all further communications. If you are the provider generating the session token, then you can use JWT to embed the information your application needs to not only identify the user, but embed their roles and any other attributes you use to decide access. I do recommend signing the token.
DB for authentication access
This is an implementation detail. You can use a managed service like AWS Cognito, or Atlassian Crowd to handle all the nitty gritty details, and to keep up with 3rd party identity management solutions. Cognito has the added benefit of having control over the JWT session token that is generated for your purposes.
AWS API Gateway
The biggest benefit that API Gateway gives you is the ability to rate-limit API calls. If you are using AWS Cognito, that can associate your AIM roles with the user's token automatically, and that follows through the API Gateway. The AIM roles can be used to control which buckets you have access to, etc.
However, I don't see the Gateway as an enforcement layer. I see it more as a traffic control layer to help scale your application.
I'm trying not to be too prescriptive
As long as you have the traits discussed at the beginning of my answer, you will have done a good job securing your application. There are good reasons why OAuth2 with JWT session tokens are a common solution. They pretty much tick off the majority of your access control needs.