eval() 쓴다고하면 사람들이 안된다고 난리를 친다. 왜 쓰면안되는지 알아보자
원래 기능을 설명해보자면
사용법자체는 단순하다.
string으로 코드를 넘겨주면 그대로 실행시켜준다.
eval("console.log('Hello World')");
console.log(eval('2 + 2'));
그럼 왜 사람들이 그렇게 안좋다고 말하는걸까?
JS는 인터프리터 언어로 태어났습니다.
하지만 여러 개선을 거치면서 지금 현재 대부분의 JS엔진은 내부에서 컴파일 과정을 거칩니다.
그래서 엄청난 속도 개선을 이루어냈죠
하지만 eval을 쓰면 실행할때마다 컴파일이 일어납니다.
그래서 무조건 인터프리터로 동작하게 됩니다. 속도에 아무런 이점이 없고 오히려 안좋죠
단순 string 변수로 표현되는게 아니라 코드를 string으로 던지는 것이기 때문에 가독성이 떨어질수밖에 없습니다.
가독성의 연장인데 string으로 취급되니까 ide에서 제공하는 여러 문법체크나 기능에 안걸려서 틀린부분이 있다면 찾기가 힘듭니다.
string으로 들어오기 때문에 어떠한 체크도 하지않고 들어오는값은 무조건 실행시켜버립니다.
악의적인 공격을 string에 넣어버려도 그냥 실행시켜버린다는 것입니다.
eval()은 단점만 있는 사용하면 안되는 함수이다. 쓰지말자.
비슷한 이유로 JSP에서도 JSTL이 아니고 c:out을 써라라는 말이 있는데
그것또한 몇가지 이유가 있지만 보안이슈가 가장크다.
엄격한 태그 규칙을 위해 사용합니다.
개행문자 파싱의 차이 때문에 사용합니다.
보안성 때문에 사용합니다.
JSTL로 쓰면 html이나 스크립트가 실행되어 위험
예시로...<script>alert('hello')</script> 이런거 넣어도 실행되어버린다.
XSS공격에 취약합니다.
XSS공격은 웹사이트에 스크립트 코드를 주입시켜서 웹사이트를 공격하는 방법입니다.
몇가지 이유가 있지만 보안때문에 XSS공격을 막기 위해서 c:out을 사용해야 한다.