자바스크립트 eval()과 eval을 대체할 메써드: eval과 New Function()
서론
웹 개발의 세계에서 코드를 동적으로 실행하는 방법은 많이 있습니다. 그 중 eval()
은 아마도 가장 많이 알려져 있을 것입니다. 그러나, 이 명령은 여러 위험성을 내포하고 있습니다. 여기서는 그 위험성과 그 대안으로 사용할 수 있는 new Function()
에 대해 알아보도록 하겠습니다.
1. eval()
의 위험성
eval()
의 사용은 많은 웹 개발자들 사이에서 조심스러운 주제입니다. 그 이유는 무엇일까요?
1.1. 보안 취약점
eval()
은 받아들인 문자열을 그대로 코드로 해석하고 실행합니다. 이는 사용자나 다른 소스로부터 받아들인 데이터에 대해 이 함수를 사용하면 심각한 보안 위협이 될 수 있습니다.
var userContent = getUserInput(); // 사용자로부터 입력받는 함수
eval(userContent); // 위험! 사용자가 입력한 내용이 그대로 코드로 실행될 수 있습니다.
이렇게 되면 악의적인 사용자는 웹사이트를 공격하거나, 데이터를 탈취하는 코드를 삽입할 수 있습니다.
1.2. 최적화 어려움
대부분의 현대 JavaScript 엔진들은 코드 최적화를 위한 다양한 기법을 사용합니다. 그러나 eval()
이 코드 내에 있으면, 해당 부분의 코드는 최적화하기 어렵게 됩니다. 이로 인해 전체적인 성능이 저하될 수 있습니다.
2. new Function()
소개
eval()
의 위험성을 피하면서 코드를 동적으로 실행할 방법은 없을까요? 바로 new Function()
이 그 해결책입니다.
2.1. 사용법
new Function()
은 매개변수와 함수 본문을 문자열로 받아들여, 새로운 함수를 반환합니다.
const add = new Function('a', 'b', 'return a + b');
console.log(add(2, 3)); // 출력: 5
2.2. eval()
과의 주요 차이점
new Function()
의 가장 큰 특징은 항상 전역 스코프에서 실행된다는 것입니다. 즉, 현재 스코프의 지역 변수에 접근할 수 없다는 점에서 eval()
과는 큰 차이가 있습니다.
3. eval
과 new Function()
의 차이점
3.1 실행 컨텍스트
eval
은 현재의 실행 컨텍스트에서 코드를 평가합니다. 반면, new Function()
은 항상 글로벌 컨텍스트에서 코드를 평가합니다.
3.2 범위 제한
new Function()
은 생성될 때의 지역 변수에 접근할 수 없습니다. 이는 악성 코드 실행의 위험을 줄여주는 중요한 특징입니다.
3.3 성능
이미 언급했듯이, eval
은 최적화하기 어렵습니다. 그러나 new Function()
은 이런 문제를 그렇게 겪지 않아 성능에 더 유리할 수 있습니다.
결론
eval
의 위험성을 피하면서도 동적 코드 실행의 이점을 활용하고 싶다면, new Function()
이 바람직한 대안입니다. 안전하면서도 유연한 코드 작성을 위해 이 방법을 고려해보세요