토큰은 분야별 의미가 다르다.
프로그래밍 언어에서는 문법적으로 더 이상 나눌 수 없는 기본적인 언어요소를 뜻하는데
하나의 키워드나 연산자 혹은 구두점 등이 토큰이 될 수 있다.
네트워크에서 말하는 토큰은 네트워크를 따라 돌아다니는 일련의 비트열로
컴퓨터는 네트웍을 따라 순환하는 토큰을 잡았을 대만 네트워크에 메세지를 보낼 수 있다.
또한 각 네트워크에는 한 개의 토큰만이 존재하기 때문에 두 대 이상의 컴퓨터가 동시에
메세지를 보낼 가능성을 사전에 차단하는 기능을 한다.
이 글에서 다를 토큰은 HTTP 통신에서 사용하는 토큰으로 로그인 기반의 기능을 사용하는데 있어서
사용되는 중요한 열쇠 정도로 생각하면 된다.
토큰을 사용하는 시스템에서
유저가 브라우저를 통해 로그인을 시도할 떄 서버상에서 일치하는 유저 정보를 찾았다면
인증 확인의 표시로 토큰을 전달해준다.
브라우저는 서버로부터 받은 토큰을 간직하고 있다가
새로운 요청을 보낼 때마다 토큰을 함께 보내고,
서버에서 토큰을 복호화 한 후 내용을 검증한다.
요새 가장 많이 사용되는 토큰 인증 방식을 꼽으라면 jwt인증을 꼽을 수 있다.
jwt은 Json Web Token의 약자로 자바스크립트 객체를 가지고 토큰을 만들었다는 뜻이다.
여기서 Json은 Javascript Object Notation의 약자로 하나의 자바스크립트 객체 표기법 이다.
jwt 사용한다면 XSS공격과 CSRF공격을 꼭 염두에 두고 있어야 한다.
XSS는 보안이 취약한 웹사이트에서 악의적인 스크립트를 넣어 놓고 사용자가 이 스크립트를 읽게 끔
유도하여 유저의 정보를 빼오는 공격 기법이다.
너무나 유명해서 이제는 통하지 않는 XSS 공격 예시를 보여주겠다.
위처럼 게시글을 작성할 때 스크립트를 끼워넣어
글을 읽은 사람의 토큰을 자신이 설정한 백엔드 주소로 보낼 수 있다.
혹은 아래와 같은 방법도 유명하다.
이미지 태그의 src에 말도 안되는 경로를 적어
onerror를 유발시켜 토큰정보를 빼내는 스크립트를 실행시키는 수법이다.
이러한 방법들은 react-quill , DOMPurify 라이브러리를 사용하는 것만으로도 막을 수 있다.
CSRF는 사용자 의지와는 상관없이 해커가 의도한 행위(수정, 삭제, 등록 등)를 사용자 권한을 이용해 서버에 요청을 보내는 공격이다.
예를 들어 사용자가 A사이트(user.com)에 로그인하여 쿠키 혹은 토큰을 가지고 있다고 하자.
이 상태에서 해커가 사용자에게 악의적인 사이트에 들어오도록 유도한다.(스팸 메일 등)
악의적인 사이트에는 A사이트에 생성, 수정, 삭제등의 요청을 보내는 스크립트가 들어있다.
<img src="http://user.com/get" width="0" height="0" />
// 또는
<form action="http://user.com/delete" method="post">
<input type="hidden" name="body" value="추천인을 써주세요" />
<input type="submit" value="전송"/>
</form>
img, form태그를 이용해 사용자가 의도치 않게 A사이트에 요청을 보내게되면
사용자가 로그인했을 때 생긴 쿠키 혹은 토큰이 같이 전송된다.
그렇게 되면 사용자는 의도치 않게 (생성, 수정, 삭제)요청을 보내게 된다.
좋은글 잘 보고 갑니다~