There are a lot of good answers here. I will integrate some of the answers that I think are most relevant, and add a few more suggestions.
1) Should the JWT token be limited to verifying the signature of the token itself, relying only on the integrity of the server’s secrecy or accompanied by a separate verification mechanism?
No, due to reasons not related to the compromise of the private key. Each time a user logs in using a username and password, the authorization server must store either the generated token or metadata about the generated token. Think of this metadata as an authorization entry. This pair of users and applications should have only one valid token or authorization at any given time. Useful metadata is the user identifier associated with the access token, application identifier and the time the access token was issued (which allows you to cancel existing access tokens and issue a new access token). In each API request, verify that the token contains the correct metadata. You need to save information about when each access token was released, so that the user can cancel existing access tokens if their credentials were compromised, and log back in and start using the new access token. This will update the database from the moment the access token is issued (authorization creation time). In each API request, verify that the access token issuance time is after the authorization time has been created.
Other security measures included non-JWT logging and the requirement for a secure signature algorithm such as SHA256.
2) If JWT signature verification is the only token verification tool, which means that server privacy integrity is a breakpoint, how do I manage server secrets?
A compromise of server secrets will allow an attacker to issue access tokens for any user, and storing access token data in step 1 will not necessarily prevent the server from accepting these access tokens. For example, let's say that the user was granted an access token, and then later the attacker generates an access token for this user. The access token authorization time will be valid.
As Akshay Dhalvala says, if your secret on the server side is compromised, then you have more problems, because this means that the attacker has broken your internal network, source code repository, or both.
However, a system to mitigate the damage of a compromised secret server and avoid keeping secrets in the source code involves secretly rotating the token using a coordination service, such as https://zookeeper.apache.org . Use the cron job to generate app secrets every few hours or so (no matter how long access tokens are available) and click on the updated secret on Zookeeper. On each application server that needs to know the secret of the token, configure the ZK client, which is updated whenever the ZK node value changes. Keep the primary and secondary secret, and each time the token secret changes, set the new token secret in the primary and old secret token to the second. Thus, existing valid tokens will be valid because they will be checked for secondary secret. By the time the secondary secret is replaced with the old primary secret, all access tokens issued with the secondary secret will have expired.