용량이 큰 이미지와 글이 같이 있는 문서를 화면에 띄운다고 가정했을때, 텍스트는 용량이 작아서 빠르게 나타나지만 이미지는 용량이 크기 때문에 느리게 로딩되는 것을 확인할 수 있다. 만약 이렇게 처리되지 않고 텍스트와 이미지 로딩이 모두 끝난 후 화면이 나온다면 사용자는 로딩이 끝날때까지 기다려야 한다.
따라서, 로딩이 먼저 끝난 텍스트를 먼저 나오게 하는 것이 좋다. 이와 같은 방식을 가지려면 텍스트 처리용 프로세스, 이미지 처리용 프로세스를 별도로 운영하면 될 것이다.
어떠한 대상의 기본적인 동작(속성 접근, 할당, 순회, 열거, 함수 호출 등)의 작업을 가로챌 수 있는 객체를 뜻하며, 자바스크립트에서는 프록시 객체는 두개의 매개변수를 가진다.
ex)
const handler = {
get: function(target, name) {
return name === 'name' ? `${target.a} ${target.b}` : target[name]
}
}
const p = new Proxy({a: 'KUNDOL', b: 'IS AUMUMU ZANGIN'}, handler)
console.log(p.name) // KUNDOL IS AUMUMU ZANGIN
설명) new Proxy로 선언한 객체의 a와b라는 속성에 특정 문자열을 담아서 handler에 'name이라는 속성에 접근할 때는 a와 b라는 것을 합쳐서 문자열을 만들게 구현하였다. p라는 변수에 name이라는 속성을 선언하지 않았는데도 p.name으로 name 속성 접근하려 할 때 그부분을 가로채 문자열을 만들어 반환하는 것을 볼 수 있다.
프록시서버는 서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용프로그램을 가리킨다.
프록시 서버로 쓰이는 nginx
잠깐) 버퍼오버플로우
프록시 서버로 쓰는 CloudFlare
잠깐) CDN(Content Delivery Network)
프론트엔드 개발시 프론트엔드 서버를 만들어서 백엔드 서버와 통신할 때 주로 CORS 에러가 나는데, 이를 해결하기 위해 프론트엔드에서 프록시 서버를 만들기도 한다.
ex)
문제발생
프론트엔드에서는 127.0.0.1:3000으로 테스팅 , 백엔드 서버에서는 127.0.0.12010
-> 서로 포트번호가 다르기 때문에 CORS 에러 발생
해결방법 2가지
1. 프론트엔드에서 target 주소를 설정
axios.get("/stocks/days")
module.exports = {
devServer:{
proxy:{
'^/stocks':{
target:'http://127.0.0.1:12010'
}
}
}
}
2. 서버에서 CORS 설정
//ex) node express
const cors = require('cors')
app.use(cors())
잠깐) 오리진 & SOP
오리진: 프로토콜과 호스트 이름, 포트의 조합을 말한다.
https://houya.com:12010/test 라는 주소에서 오리진은 https://houya.com:12010 을 뜻.
SOP: Same Origin Policy라는 뜻, 같은 오리진끼리 로드한다는 의미
상황: 사용자가 브라우저를 통해 네이버를 보는데, 네이버는 네이버의 서버에서 받아온 정보를 받아와서 화면단에 보이는 것. 만약 공격자가 하이재킹으로 서버의 정보를 빼내려한다면?
-> 이를 방지하기 위해 같은 오리진끼리만 정보 전달이 되게 설정한 것(SOP)
simple request의 경우?
참고: 민감한 인증 정보 같은 경우 Access-Control-Allow-Credentials 을 서버와 프론트엔드 모두 true로 설정하고, cors에 와일드카드를 넣은 쿠키나 인증헤더값은 민감함으로 에러가 발생
참고:https://min94programming.tistory.com/30
https://velog.io/@newtownboy/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C%ED%8C%A8%ED%84%B4Proxy-Pattern