I start planning a REST API with node.js ,express and mongodb. The API provides data for a website (public and private area) and maybe later a mobile app. The frontend will be developed with AngularJS.
For some days I read a lot about securing REST APIs, but I don’t get to a final solution. As far as I understand is to use HTTPS to provide a basic security. But how I can protect the API in that use cases:
Only visitors/users of the website/app are allowed to get data for the public area of the website/app
Only authenticated and authorized users are allowed to get data for private area (and only data, where the user granted permissions)
At the moment I think about to only allow users with a active session to use the API. To authorize the users I will use passport and for permission I need to implement something for myself. All on the top of HTTPS.
有人可以提供一些最佳实践或经验吗?我的“体系结构”是否缺乏?
如果您想保护您的应用程序安全,那么绝对应该从使用HTTPS而不是HTTP开始,这可以确保在您和用户之间创建安全的通道,从而防止嗅探来回发送给用户的数据并有助于保留数据。交换了机密。
您可以使用JWT(JSON Web令牌)来保护RESTful API,与服务器端会话相比,这有很多好处,主要包括:
1-更具可扩展性,因为您的API服务器将不必为每个用户维护会话(当您有很多会话时,这可能是一个沉重的负担)
2-JWT是自包含的,并且具有定义用户角色的声明,例如,他可以在日期和到期日访问和发布的内容(此日期之后,JWT将无效)
3-更易于处理负载均衡器,并且如果您有多个API服务器,因为您不必共享会话数据,也无需配置服务器将会话路由到同一服务器,那么只要JWT的请求碰到任何服务器,就可以对其进行身份验证和授权
4-减轻了数据库负担,也不必为每个请求不断存储和检索会话ID和数据
5-如果您使用强键对JWT进行签名,则JWT不会被篡改,因此您可以信任随请求一起发送的JWT中的声明,而无需检查用户会话以及他是否被授权,您只需检查JWT,然后就可以知道该用户可以执行的操作。
许多库提供了使用大多数编程语言创建和验证JWT的简便方法,例如:在node.js中,最受欢迎的一种是jsonwebtoken
由于REST API通常旨在使服务器保持无状态,因此JWT与该概念更加兼容,因为每个请求都是使用自包含(JWT)的授权令牌发送的,而与服务器会话相比,服务器不必跟踪用户会话服务器是有状态的,以便记住用户及其角色,但是,会话也被广泛使用并具有其优点,您可以根据需要进行搜索。
需要注意的重要一件事是,您必须使用HTTPS将JWT安全地交付给客户端,并将其保存在安全的地方(例如,本地存储中)。
您可以从此链接了解有关JWT的更多信息。