28일)
- 오늘의 알고리즘 문제
나의 뿌듯한 풀이
function solution(s, n) {
let bigger= ["A","B","C","D","E","F","G","H","I","J","K","L",
"M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
let small=["a","b","c","d","e","f","g","h","i","j","k","l","m",
"n","o","p","q","r","s","t","u","v","w","x","y","z"]
let result =""
for(i=0; i<s.length; i++){
if(bigger.includes(s[i])){
if(bigger.indexOf(s[i])+n >25 ){
result += bigger[bigger.indexOf(s[i])+n-26]
}else{
result += bigger[bigger.indexOf(s[i])+n]
}
} else if (small.includes(s[i])){
if(small.indexOf(s[i])+n>25){
result += small[small.indexOf(s[i])+n-26]
}else {
result += small[small.indexOf(s[i])+n]
}
}else if(s[i] === " "){
result += " "
}
} return result
}
- 웹에디터 이해 ( 그냥 input text는 너무 안예뻐!)
- npm의 react-draft-wysiwyg, react-quill을 찾아 들어가보자
-> react의 유명한 폼 라이브러리이다 !
-> wysiwyg 에디터를 만들 수 있는 사람 !
-> toast ui editor (노션처럼 만들수 있는 에디터) - 우리는 react quill 써보자 임포트해서!
-import 사이트 긁어올때 commonjs는 옛날방식이야 !
저 onchange는 quil 자체의 함수이름이라, event가 함수에 들어오는것이 아니라, value가 바로 들어온다고 쓰여있는걸 확인할 수 있다 !
(그러니 라이브러리 사용할때 설명서를 잘읽자)
그래서 나는 이렇게하면 reactquil이 될 줄 알았는데 안돼!
document~가 없다고 한다
이유는, 역시 프리렌더링 할때 프론트엔드서버에서는 react quill을 읽을수 없어서 !
{typeof window !== "undefined" && (어라 얘도 안되네 !
다이나믹 임포트를 해보자 !
react 전용 프레임워크가 nextjs 그래서 프리렌더링같은게 진행이되는거야
순수한 react 쓰면 프리렌더링 없음 거기서 쓰면 이런 오류가 생기진 않겠지만,
우리는 nextjs를 쓰니까 .. 다이나믹 임포트를 해야한다 !
그래서 reactquill의 임포트 방식을 바꿔봤다!
const ReactQuill = dynamic(()=> import("react-quill"),{ ssr : false})
다이나믹 임포트 방법 !
- react hook form을 써보자 !
(배웟는데 생소하네...)
import {useForm} from 'react-hook-form'
const {register, handleSubmit} = useForm({
mode:"onChange"
})
콘솔에 value찍히는거 보면 우리의 value값이 태그안에 감싸진채 찌히는걸 볼수 있다 !
-onChangeContents를 react-hook-form에 연결해보자
강제로 1
-왜 아무것도 안썼는데 빈값이 아니게 나오지 ?
-> 그래서 저기 적혀있는 값이면 ! 빈값으로 인식해주자라고 코드에 지정을 해준다
->mode:"onChange"입력해서 에러 실시간 체인지띄워준건데, react quill의 라이브러리는 강제로 onchange를 시켜줘야한다(저기적힌이름만온체인지..!)
->리액트 퀼을 입력했지만, 컴텐츠라는 키를 온체인지할거다를 추가해줘야한다
useform에서 trigger가져와서 trigger("contents") 추가해주자 - form 태그 써서 handlesubmit쓰는 부분 익히자 !
- if~else if~else 복잡해서 우리 배웠던거가 ealry exit
있을때 있을때 말고 없을때로 조건지정 !
-> React quill을 써서 등록하고 조회하는 부분 다시 복습해보자
-콘솔에 찍어봤던 value자체가 그냥 그 data로 들어가 버리는건 어쩌지 ?
태그를 태그로 인식하게 해주자 ! 모든걸 문자열로 인식하게 말고 !
->dangerouslySetInnerHTML의 등장....!
={{ __html:data?.fetchBoard.contents}}이렇게 적어주니까 되네 ?
-> 태그자체로 인식하도록 해주는 방법이다 ! (presenter에 적는 부분) 근데 뭔가 덴져러스,,,,위험해보이네 왜 ?- 크로스사이드스크립트(XSS) (localstorage는 위험햇)
콘솔에 보면 react quill이 onchange에 막아놓긴했다
그래서 이렇게 텍스트로 나오도록 해줬어 요거까지는
얘는 근데 reactquill에서만 해당하고 백엔드에 직접 들어가서 뮤테이션을 보내보면..!(자주사용되는 해킹기법을 사용하여(이미지태그사용)..원두멘토님은 모르는게 뭘까?)
이렇게 등록을 하고 !
마우스 사러 들어왔는데 토큰을 탈취당하는 현장....
-> 아무튼 setinnerhtml이 굉장히 위험하다! - npm에 dompurify라는데가 있어 !
-> 얘네를 사용하면 태그가 있는 문장이 자동으로 차단이 된다 !
yarn add dompurify 해주자, 타입스르비투도
-데이터를 조회하는 페이지에서 임포트해주자
dangerouslySetInnerHTML={{
__html:Dompurify.sanitize(data?.fetchBoard.contents)
}
아까 적었던 부분을 이렇게 코드를 작성해주니 보안완료!
인줄 알았는데 우리 next쓰니까 프리렌더링할때 프론트 서버에서 dom못읽으니까 태그를 브라우저 일때만 화면에 보이게끔 해주ㅏㅈ
-> Cross-Site-Script(XSS)
사이트를 가로질러서 스크립트를 삽입하는 공격을 막아주는법!
- OWASP TOP 10
https://ko.wikipedia.org/wiki/OWASP
여기에 다양한 웹 애플리케이션 취약점 중에서 빈도가 많이 발생하고, 보안상 영향을 크게 줄 수 있는 것들 10가지가 있다!
이러한 컴터공학 정보들은 개발자로서 알아둘것 !
- SQL인젝션은 아직도 일어나고 있다 (qqq || 1===1 똑똑해 아주~)
- hydration-issue(하이드레이션에서 css문제발생!)
- 나는 분명 이렇게 썼는데
<div style={{color: "indianred"}}>작성자: {data?.fetchBoard.writer} </div>
<div style={{color: "pink"}}>제목: {data?.fetchBoard.title}</div>
{/* <div>내용:{data?.fetchBoard.contents} </div> */}
{typeof window !== "undefined" && (
<div style={{color: "red"}} dangerouslySetInnerHTML={{
__html:Dompurify.sanitize(data?.fetchBoard.contents)
}}>
</div>
)}
<div style ={{color: "green"}}>상품가격 : </div>
왜 색깔이 이렇게 나오지 ?
서버에서 프리렌더링할때 자바스크립트, 함수바인딩..이런거 안하고
태그의 위치들만 확인하고,
서버에서 최종적으로 그릴때 (하이드레이션 할때)한다그랬지!
아까 window아니면 그려주지 않은 dompurify빼고 렌더했었지
그래서 그 div는 인식하지 못하고, 브라우저와서
갑자기 조건 생겨서 dompurify div를 그리려 하는거지
그래서 내가 정한 색깔을 읽지못하거 나오는거!
이러한 문제들을
hydration 이슈라고 한다
해결은 간단하다 서버에서 그릴때도 div개수를 맞춰주면 된다
- 동기의 코드리뷰 시간
-자주뜨는 에러에 관한 부분
-400에러(보통은 graphql 오류)
-> gql확인 쿼리확인하자 ! 잘못된 문법을 나타낸다
-나머지 에러에 관한 부분
-이번주배운내용 정리부분
컴포넌트 prev, recoil, closure, HOC,react-form, yup 잘 정리해주셔따
내가 헷갈리던 부분 클로져랑 hoc ...
Author And Source
이 문제에 관하여(28일)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kimareum/28일저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)