Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript eval() 함수 사용이 왜 위험한가? 보안 문제와 성능 이슈 총정리

JavaScript의 eval() 함수는 문자열로 전달된 코드를 실행하는 강력하지만 위험한 기능입니다. 인자로 받은 문자열을 실제 JavaScript 코드로 해석하여 실행하는데, 편리해 보이지만 실무에서는 사용을 피해야 할 함수로 꼽힙니다.

eval()이 나쁜 생각인 이유

eval()을 사용하면 다음과 같은 심각한 문제가 발생할 수 있습니다.

1. 보안 취약점

eval()은 전달된 문자열을 그대로 코드로 실행하기 때문에, 악성 코드가 삽입될 경우 그대로 실행됩니다. 특히 사용자 입력값을 eval()로 처리하면 XSS(교차 사이트 스크립팅) 공격에 노출되어 민감한 데이터가 유출되거나 시스템이 조작될 수 있습니다.

2. 느린 실행 속도

eval()은 런타임에 새로운 코드를 컴파일하고 실행해야 하므로, 일반적인 코드 실행보다 상당히 느립니다. 또한 JavaScript 엔진의 최적화를 방해하여 전체적인 성능 저하를 유발합니다.

3. 별도의 실행 범위(Scope)

eval()은 자체적인 실행 스코프를 가지므로, 예상치 못한 변수 충돌이나 스코프 오염이 발생할 수 있습니다. 이는 디버깅을 어렵게 만들고 코드 유지보수성을 크게 떨어뜨립니다.

eval() 사용 예시

참고로 eval()은 아래와 같이 구현할 수 있습니다.

<html>
   <body>
      <script>
         var a = 30;
         var b = 12;
         var res1 = eval("a * b") + "<br>";
         var res2 = eval("5 + 10") + "<br>";
         document.write(res1);
         document.write(res2);
      </script>
   </body>
</html>

위 코드는 각각 36015를 출력합니다.

안전한 대안

eval() 대신 다음과 같은 방법을 사용하는 것이 좋습니다.

  • JSON.parse(): JSON 형식의 문자열을 객체로 변환할 때 사용합니다.
  • 산술 연산 파싱: 단순 계산이라면 직접 연산자를 처리하거나 검증된 라이브러리를 활용합니다.
  • Function 생성자: 불가피한 경우에도 new Function()이 전역 스코프에서만 실행되어 상대적으로 안전하지만, 여전히 신중하게 사용해야 합니다.

결론적으로, eval()은 보안 위험과 성능 저하라는 명확한 단점 때문에 특별한 이유가 없다면 사용하지 않는 것이 가장 좋습니다.