엔진은 어떻게 동작?
- 엔진(브라우저라면 내장 엔진)이 스크립트를 읽습니다(파싱)
- 읽어들인 스크립트를 기계어로 전환합니다(컴파일)
- 기계어로 전환된 코드가 실행됩니다. 기계어로 전환되었기 때문에 실행 속도가 빠릅니다.
엔진은 프로세스 각 단계마다 최적화를 진행합니다. 심지어 컴파일이 끝나고 실행 중인 코드를 감시하면서, 이 코드로 흘러가는 데이터를 분석하고, 분석 결과를 토대로 기계어로 전환된 코드를 다시 최적화하기도 합니다. 이런 과정을 거치면 스크립트 실행 속도는 더욱 더 빨라집니다.
브라우저에서 할 수 있는 일
모던 자바스크립트는 메모리나 CPU와 같은 저수준 영역의 조작을 허용하지 않습니다. 애초에 브라우저를 대상으로 만든 언어이기 때문에!
Javascript 능력은 실행 환경에 상당한 영향을 받습니다. Node.js 환경에선 임의의 파일을 읽거나 쓰고, 네트워크 요청을 수행하는 함수를 지원합니다.
브라우저 환경에선 웹페이지 조작, 클라이언트와 서버의 상호작용에 관한 모든 일을 할 수 있습니다.
브라우저에서 자바스크립트로 할 수 있는 일
- 페이지에 새로운 HTML을 추가하거나 기존 HTML, 혹은 스타일 수정
- 마우스 클릭이나 포인터의 움직임, 키보드 키 눌림 등과 같은 사용자 행동에 반응하기
- 네트워크를 통해 원격 서버에 요청을 보내거나, 파일 다운로드, 업로드하기(AJAX나 COMET과 같은 기술 사용)
- 쿠키를 가져오거나 설정하기. 사용자에게 질문을 건네거나 메시지 보여주기
- 클라이언트 측에 데이터 저장하기 (로컬스토리지)
브라우저에서 할 수 없는 일
브라우저는 보안을 위해 자바스크립트 기능에 제약을 걸어둠. 이런 제약은 악성 웹페이지가 개인 정보에 접근하거나 사용자의 데이터를 손상하는 것을 막기 위해 만들어졌다.
몇 가지 제약사항
- 웹페이지 내 스크립트는 디스크에 저장된 임의 파일을 읽거나 쓰고, 복사하거나 실행할 때 제약을 받을 수 있다. 운영체제가 지원하는 기능을 브라우저가 직접 쓰지 못하게 막혀있기 때문.
모던 브라우저를 사용하면 파일을 다룰 순 있다. 하지만 접근은 제한되어 있다. 사용자가 브라우저 창에 파일을 '끌어다 두거나' input 태그를 통해 파일을 선택할 때와 같이 특정 상황에서만 파일 접근을 허용.
카메라나 마이크같은 디바이스와 상호 작용하려면 사용자의 명시적 허가가 있어야 한다. 자바스크립트가 활성화된 페이지라도 사용자 몰래 웹 카메라를 작동시켜 수집한 정보를 국가안보국과 같은 곳에 몰래 전송할 수 없다.
- 브라우저 내 탭과 창은 대개 서로의 정보를 알 수 없다. 그런데 자바스크립트를 사용해 한 창에서 다른 창을 열 때는 예외가 적용된다. 하지만 이 경우에도 도메인이나 프로토콜, 포트가 다르다면 페이지에 접근할 수 없다.
이런 제약사항을 동일출처정책(SameOriginPolicy)이라 부른다
이 정책을 피하려면 두 페이지는 데이터 교환에 동의해야 하고, 동의와 관련된 특수한 js코드를 포함하고 있어야 한다. 다시 한번 말하지만, 이런 제약사항은 사용자의 보안을 위해 만들어졌다.
- 자바스크립트를 이용하면 페이지를 생성한 서버와 쉽게 정보를 주고받을 수 있다. 하지만 타 사이트나 도메인에서 데이터를 받아오는 건 불가능하다. 가능하다할지라도 원격 서버에서 명확히 승인을 해줘야 한다(HTTP헤더 등을 통해)
이 역시 보안을 위해 만들어진 제약사항.