CloudFront
CDN (Content Delivery Network)
•
캐시 서버에 분산되어 있는 컨텐츠를 사용자가 필요로 할 때마다 캐시 서버에 요청하여 컨텐츠를 제공함.
동작 방식
동작 방식
데이터 구성방법
1.
Amazon S3 bucket 또는 고유 HTTP 서버와 같은 오리진 서버를 지정하고, CloudFront는 이로부터 파일을 가져온 다음 전 세계 CloudFront Edge Server에 배포합니다.
(오리진서버는 객체의 최종 원본을 저장합니다.)
2.
오리진 서버에 파일을 업로드합니다.
3.
Client가 웹 사이트나 애플리케이션을 통해 파일을 요청할 경우 응답할 때 어떤 오리진 서버에서 데이터를 받아올지 CloudFront 배포를 생성합니다. 또한 모든 배포 요청을 기록할지, 배포 시작시 활성화 여부를 세부적으로 선택해줍니다.
4.
CloudFront는 배포에 사용될 Domain Name을 할당하고, 이는 CloudFront Console에서 확인할 수 있습니다. 또는 API 요청등과 같은 프로그램 요청에 대한 응답으로 반환합니다.
5.
CloudFront에서는 배포의 구성을 모든 해당 Edge Server 또는 CloudFront가 파일의 사본을 캐싱하는 지리적으로 분산된 데이터 센터의 POP(Point of Presenc) 서버 모음으로 보냅니다.
Edge Server
데이터 전달 과정
•
Client로부터 Edge Server로 요청을 보냅니다.
•
Edge Server는 요청이 발생한 데이터에 대하여 캐싱 여부를 확인합니다.
•
Client에 근처에 잇는 Edge Server중 캐싱 데이터가 존재한다면 사용자의 요청에 맞는 데이터를 응답합니다.
•
요청받은 데이터에 대해 Origin Server에서 휙득한 후 Edge Server에 캐싱 데이터를 생성하고, Client로부터 응답을 발생합니다.
캐시 : 컴퓨터 성능을 상향시키기 위해 사용하는 메모리
캐싱 : 캐시 영역으로 데이터를 가져와 접근하는 방식
CORS
CORS
•
Cross-Origin Resource Sharing의 약자로 현재 웹페이지가 이 페이지를 제공한 서버 (Origin)가 아닌 다른 서버(Cross Origin)에게 자원(image, file, script 등등)을 요청/호출하는 것
Cross Origin
Cross Origin
1.
Protocol
HTTP, HTTPS는 서로 다른 Protocol입니다.
2.
Domain
example.com과 sample.example.com은 다른 Domain입니다.
3.
Port
80번과 8080은 서로 다른 Port입니다.
CORS 사용이유
CORS 사용이유
CSRF(cross site request forgery)와 같이 사용자의 의지와 무관하게 공격자가 의도한 웹 페이지에 접근하여 공격하는 걸 막기위해 CORS를 사용합니다.
CORS 동작 방식
Simple Request
Simple Request인 경우
1.
서버로 요청을 합니다.
2.
서버의 응답이 왔을 때 브라우저가 요청한 Origin과 응답한 헤더 Access-Control-Request-Headers의 값을 비교하여 유효한 요청이라면 Resource를 응답합니다. 만약 유효하지 않은 요청이라면 브라우저에서 이를 막고 에러를 발생합니다.
Simple requests란?
HTTP method가 다음 중 하나이면서
•
GET
•
HEAD
•
POST
자동으로 설정되는 헤더는 제외하고, 설정할 수 있는 다음 헤더들만 변경하면서
•
Accept
•
Accept-Language
•
Content-Language
Content-Type이 다음과 같은 경우
•
application/x-www-form-urlencoded
•
multipart/form-data
•
text/plain
Simple Request라고 부릅니다. 이 요청은 추가적으로 확인하지 않고 바로 본 요청을 보냅니다
Preflight
1.
Origin헤더에 현재 요청하는 origin과, Access-Control-Request-Method헤더에 요청하는
HTTP method와 Access-Control-Request-Headers요청 시 사용할 헤더를 OPTIONS 메서드로 서버로 요청합니다. 이때 내용물은 없이 헤더만 전송합니다.
2.
브라우저가 서버에서 응답한 헤더를 보고 유효한 요청인지 확인합니다. 만약 유효하지 않은 요청이라면 요청은
중단되고 에러가 발생합니다. 만약 유효한 요청이라면 원래 요청으로 보내려던 요청을 다시 요청하여 리소스를
응답받습니다.
preflight 요청이란?
Simple requests가 아닌 cross-origin요청은 모두 preflight 요청을 하게 되는데, 실제 요청을
보내는 것이 안전한지 확인하기 위해 먼저 OPTIONS 메서드를 사용하여 cross-origin HTTP 요청을
보냅니다. 이렇게 하는 이유는 사용자 데이터에 영향을 미칠 수 있는 요청이므로 사전에 확인 후 본 요청을
보냅니다
CORS Option
CORS Option
Access-Control-Allow-Origin
•
응답이 요청한 코드와 공유 여부를 나타내는 헤더 요청
Access-Control-Allow-Headers
•
Access-Control-Allow-Headeres를 포함하는 Prefilght Reqeust의 응답에 사용되는 헤더
Access-Control-Allow-Methods
•
요청을 허용하는 메서드
Access-Control-Expose-Headers
•
브라우저 측에서 접근할 수 있게 허용해주는 헤더를 지정
Access-Control-max-Age
•
Prefilght Request 요청 결과를 캐시할 수 있는 시간
Access-Control-Allow-Credentials
•
사전 요청의 응답으로 사용할 때 실제 요청에서 자격 증명을 이용할 수 있는 지에 대해서 알려줌
응답 헤더 목록
Access-Control-Allow-Origin
•
브라우저가 해당 origin이 자원에 접근할 수 있도록 허용합니다. 혹은 credentials이 없는 요청에 한해서 모든 origin에서 접근이 가능하도록 허용합니다.
Access-Control-Expose-Headers
•
브라우저가 액세스할 수 있는 서버 화이트리스트 헤더를 허용합니다.
Access-Control-Max-Age
•
얼마나 오랫동안 preflight요청이 캐싱 될 수 있는지를 나타낸다.
Access-Control-Allow-Credentials
•
Credentials가 true 일 때 요청에 대한 응답이 노출될 수 있는지를 나타냅니다.
•
preflight요청에 대한 응답의 일부로 사용되는 경우 실제 자격 증명을 사용하여 실제 요청을 수행할 수 있는지를 나타냅니다.
•
간단한 GET 요청은 preflight되지 않으므로 자격 증명이 있는 리소스를 요청하면 헤더가 리소스와 함께 반환되지 않으면 브라우저에서 응답을 무시하고 웹 콘텐츠로 반환하지 않습니다.
Access-Control-Allow-Methods
•
preflight 요청에 대한 응답으로 허용되는 메서드들을 나타냅니다.
Access-Control-Allow-Headers
•
preflight요청에 대한 응답으로 실제 요청 시 사용할 수 있는 HTTP 헤더를 나타냅니다
CloudFront로 접근만 허용 - Lambda
CloudFront로 접근만 허용 - Lambda
import json
import requests
import boto3
url = "https://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips"
ec2 = boto3.client('ec2')
security_group_id = '<SG-ID>'
def lambda_handler(event, context):
response = requests.get(url)
load = json.loads(response.text)
ip_pools = load['CLOUDFRONT_GLOBAL_IP_LIST']
for i in ip_pools:
data = ec2.authorize_security_group_ingress(
GroupId=security_group_id,
IpPermissions=[
{
'IpProtocol': 'tcp',
'FromPort': 80,
'ToPort': 80,
'IpRanges': [{'CidrIp': i }]
}
])
Python
복사
CloudFront - Functions
CloudFront - Functions
•
Access - Request URL
function handler(event) {
var request = event.request;
var uri = request.uri;
// Check whether the URI is missing a file name.
if (uri.endsWith('/test/')) {
request.uri += 'index.html';
}
// Check whether the URI is missing a file extension.
else if (!uri.includes('.')) {
request.uri += '/index.html';
}
return request;
}
JavaScript
복사
CloudFront의 "Forward Cookies”
•
Forward cookies는 클라이언트가 보낸
쿠키를 CloudFront가 Origin 서버(예: ALB 또는 EC2)로 전달하는 기능이다.
•
이 기능은 session(세션) 정보를 유지할 필요가 있을 때 사용된다.
•
[CloudFront > Distribution > Cache Behavior]에서 "Forward cookies"을 설정할 수 있다
"Forward cookies" 예시) 사용자 로그인 정보
– 사용자 A가 웹사이트에 로그인 하면 세션 쿠키(예:session_id)가 브라우저에 저장된다.
– 사용자 A가 웹사이트의 다른 페이지로 이동할 때, CloudFront가 요청을 처리한다.
– ("Forward cookies" 설정이 활성화되었다면) CloudFront는 session_id 쿠키를 Origin 서버(예: ALB 또는 EC2)에 전달한다.
– Origin 서버는 session_id 쿠키를 읽어 사용자가 로그인했음을 확인하고, 맞춤형 대시보드나 로그인된 사용자 전용 콘텐츠를 반환한다.
이와 같이 Forward cookies를 통해 사용자는 로그인 상태를 유지하며 웹 애플리케이션을 계속 사용할 수 있다.
Forward cookies 선택 옵션
1.
None (Default) : 쿠키를 전달하지 않는다.
2.
All : 모든 쿠키를 Origin 서버로 전달한다.
3.
Whitelist : 선택한 특정 쿠키만 전달한다. 전달할 쿠키 목록을 정의할 수 있다.









