传统cdn与云cdn
Amazon Web Services是一个云服务平台,可按需提供内容交付,数据库存储以及许多其他功能和基础架构,以帮助企业采用“按需付费”的定价方法进行扩展和发展。
Amazon CDN是AWS的主要组成部分,目的是加快向全球用户分发静态或动态Web内容的速度。
例如:假设您在美国地区托管了您的网站。 并且,如果来自澳大利亚的某些用户试图访问您的网站,则路由通常会转到美国,并向您的用户接收内容。 如果您的用户再次访问该内容,该过程将花费一些时间来交付您的内容,这意味着高延迟。
对于此问题,amazon CDN提供将您的网站缓存在最近的边缘位置,并使用该边缘位置将内容交付给您在澳大利亚境内的用户。 在发送之前,它将与原始内容同步并向您发送最新详细信息。 这样,将需要较低的延迟。
但是,每个网站并不与用户共享所有内容。 有供付费用户使用的网站,或者有一些在订阅用户之间共享的私人内容。 还有一些公司通过互联网分发内容,这些内容限制了访问权限,例如业务数据,媒体流。
我们如何仅在成千上万的用户中共享私有内容给指定的用户?
例如,如果您的应用程序需要订阅,则意味着可以从Amazon CDN的私有内容功能中实现您的网站中只有私有内容在被订阅成员之间共享。 它将确保只有经过身份验证的用户才能访问并阻止其他用户访问您的私人内容。
解
使用签名的网址和签名的COOKIE访问私有内容。
签名的乌尔斯
Signed Urls是一个URL,其中包含私有内容中每个文件的信息,例如到期日期,密钥对ID和签名。 提到的数据将包含在我们发送的URL中。
Urls签名的工作方式,
在CDN分发中指定可以访问内容的受信任的签名者。开发应用程序后,为了访问您的内容,它将为受限制的应用程序对象或部分创建签名的URL。当用户请求文件时,然后,应用程序验证用户。验证后,应用程序创建并向用户返回签名的url。然后,可以将限制的数据访问给指定的用户。CDN使用公共密钥来验证签名并确认Url是否有效。 如果签名无效,则请求将被拒绝。
签名曲奇
CDN签名的COOKIE允许您控制您的私人数据,并将其分配到您要共享的用户中。 签名的COOKIE可以用于访问多个受限制的文件,而无需指定URL。
签名COOKIE的工作方式,
在CDN发行版中,我们指定了受信任的签名者以便对其进行访问。在开发应用程序之后,为了访问您的内容,我们必须向查看者(用户)发送三个set-COOKIE标头。 它们是CloudFront-Key-pair-id,CloudFront-Signature和CloudFront-Policy 。 在查看者请求之前,我们必须将set-COOKIE标头发送给用户。用户将访问您的私人内容(订阅者)。
我们的应用程序在响应中将set-COOKIE标头返回给用户,然后用户请求一个对象。在请求标头中,CDN在已签名的COOKIE中获取签名,然后使用之前在根帐户中创建的公钥对其进行验证。 使用密钥验证后,如果请求有效,它将检查策略,该策略将检查到期日期和其他选项。 然后它将访问用户请求的内容。
首先,有一些先决条件
在S3存储桶或自定义来源中托管的AWS AccountStatic Web托管lambda函数(API网关)
请注意,如果您使用AWS的免费套餐帐户,则成本将为零。 如果没有,您可以在给定的链接中参考CDN的价格,并且执行这些步骤不会涉及其他成本。 https://aws.amazon.com/cloudfront/pricing/
步骤1:创建CloudFront密钥对
从您的ROOT帐户登录
转到右上方的“用户”选项卡>选择“我的安全证书”>“ CloudFront密钥对”>“创建新密钥对”。
创建密钥对后,下载密钥对。 并且您可以在屏幕上找到“密钥对ID”作为访问密钥ID。 并在您下载的文件名中。
注意:您的根帐户中只能有一个密钥对,请确保在同一根帐户中没有创建多个活动密钥对。
步骤2:建立CDN发行版本
确保在“对象缓存”中选择“自定义”,然后为所有值输入0,然后浏览器将避免缓存任何COOKIE值,因为每次访问时您都会提供不同的COOKIE值,因此,即使缓存是CDN的主要原因,在这一点上这将是没有用的。 并选择“是”以限制查看者访问,因为这是使用签名COOKIE / URL的目的,以实现安全的内容分发。 出于测试目的,启用了所有COOKIE以及查询字符串转发和缓存。
现在,在CDN中创建私有内容之后,我们有两种访问内容的方法。
签名URL签名COOKIE
签名的URL和COOKIEs提供相同的基本功能,可让您控制私人内容。
固定政策和自定义政策
罐头策略是一种预先编写的策略,与自定义策略相比,其可控性较低。 下面的矩阵在AWS文档中提供。
步骤3.1 —使用签名的URL
您可以在带有所需模块的lambda函数中使用以下代码,以获取内容的签名URL。
1.包括“ aws-cloudfront-sign”模块。
2.输入您的私钥或pk-APXXXXXXXXXXXXX.pem文件
3.在选项中,定义密钥对ID,到期时间
4.输入您要限制的特定内容的cloudfront URL
var cf = require ( 'aws-cloudfront-sign' );
var privateKeyString = ` - - -BEGIN RSA PRIVATE KEY - - -
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX- - -END RSA PRIVATE KEY - - -` ;
var options = { keypairId : 'APXXXXXXXXXXXXXXXXX' , privateKeyString : privateKeyString, expireTime : new Date ().getTime() + 18000 }
exports.handler = ( event, context, callback ) => {const done = ( err, res ) => callback( null , {statusCode : err ? '400' : '200' ,body : err ? err.message : res,headers : {'Content-Type' : 'application/json' ,},});
var signedUrl = cf.getSignedUrl( 'http://xxxxxxxx.cloudfront.net/path/to/object' , options);
context.done( null , signedUrl);
};
步骤3.2 —签名的COOKIE
包括“ aws-cloudfront-sign”模块输入私钥或包括pk-APXXXXXXXXXXXXXXXX.pem文件在选项中,定义密钥对ID,到期时间输入cloudfront Url作为通配符。
var cf = require ( 'aws-cloudfront-sign' );
var privateKeyString = ` - - -BEGIN RSA PRIVATE KEY - - -
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX- - -END RSA PRIVATE KEY - - -` ;
var options = { keypairId : 'APXXXXXXXXXXXXXXXXX' , privateKeyString : privateKeyString, expireTime : new Date ().getTime() + 18000 }
exports.handler = ( event, context, callback ) => {const done = ( err, res ) => callback( null , {statusCode : err ? '400' : '200' ,body : err ? err.message : res,headers : {'Content-Type' : 'application/json' ,},});
var signedCOOKIEs = cf.getSignedCOOKIEs( 'http://xxxxxxxx.cloudfront.net/*, options);
context.done(null, signedCOOKIEs);
};
请参阅文档以了解进一步的更改,例如更改为自定义策略
http://docs.aws.amazon.com/AWSJavascriptSDK/latest/AWS/CloudFront/Signer.html
如果遇到错误,则在测试lambda函数时找不到模块,请包括节点模块。
https://github.com/jasonsims/aws-cloudfront-sign
1.在计算机上安装Node
2.创建一个文件夹,并在该文件夹内创建一个package.json文件
3.创建一个index.js文件,并在文件中的签名url或签名的COOKIE代码上方输入
4.安装aws-cloudfront-sign模块
5.压缩项目并在代码输入类型>上载zip文件下上载到lambda函数。
结论
希望这可以帮助您创建私人内容,并与Signed COOKIEs和Signed Urls一起提供。 对于签名的COOKIE,没有适当的教程来帮助您举例。 如果有任何问题,可以在下面发表评论。
翻译自: https://hackernoon.com/serving-private-content-from-cdn-f02eo3x78
传统cdn与云cdn