on
[보안]나의 토큰을 노리는 것들
토큰(Token)
JWT에는 두 가지 종류의 토큰이 있다.
Access Token
,Refresh Token
유저는 Access Token
을 통해서 민감한 정보에 접근할 수 있으며
두 가지 토큰중에서 실제
권한에 접근하는 토큰이다.
짧은
유효기간을 가지며 Refresh Token
을 통해서 만료된 Access Token
을 발급받을 수 있다.
Refresh Token
은 Access Token보다 긴 유효기간을 가진다. 이때, 유저는 다시 로그인하지 않아도 된다. Refresh Token이 탈취당하면, 위험하기에 정보에 민감한 사이트는 Refresh Token를 사용하지 않을 수도 있다.
XSS(Cross-Site Scripting)
스크립트
를 활용한 토큰 탈취 처럼 취약점을 노려서 javascript
와 HTML
로 악의적 코드를 웹 브라우저에 심어, 유저가 해당 게시물에 접속시 그 악성코드가 실행되는 것을 크로스 사이드 스크립트
라고 한다.
아주 유명하고 오래됐지만 위험하고 많이 사용되는 공격이라고 한다. 외부/내부 사용자 모두 공격이 가능하고, 사용자 입력이 가능한 곳에서는 모두 공격시도가 가능하고 굉장히 다양한 방법으로 공격을 할 수 있기 때문에 모두 처리하기가 까다롭다. 공격을 당하게 된다면 쿠키/세션 탈취, 악의적인 사이트로 요청 등이 일어날 수 있다.
일반적인 방법으로는 게시판
처럼 사용자가 정보를 서버에 업로드하는 곳에 XSS
공격이 담긴 데이터를 삽입하여 저장하는 방법을 사용한다.
그리고 해당 게시글을 피해자가 조회시에 XSS
스크립트를 문자열이 아닌 하나의 스크립트
언어로 인식하여 실행이 되게 되고 공격이 동작하게 된다.
방어방법
가장 기본적인 방법은 위험할 수 있는 부분을 스크립트
로 읽지 않고 문자
로만 볼 수 있게 처리해주는 것이다.
이때 사용하는 것이 HTML entity
인데 HTML의 문자들을 치환
하여 보여주는 것이다. 만약 내가 <
를 입력하고싶다면 <
로 입력하면 된다.
관련하여 라이브러리도 있으니 에디터 기능을 넣을때 잘 사용하면 좋을 것 같다.
CSRF (Cross Site Request Forgery)
인터넷 사용자가 자신의 의자와 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 만드는 공격이다.
하지만 CSRF
는 직접 사용자의 컴퓨터를 감염시키거나 서버를 공격해서 이뤄지는 공격이 아니다. 특정 조건이 필요한데
- 위조 요청을 전송하는 서비스에 피해자가 로그인한 상태
- 피해자가 공격자가 만든 피싱 사이트에 접속
이러한 조건은 생각보다 흔히 일어나는데 보통 PC환경에서 매일 사용하는 SNS나 구글,네이버등의 계정은 자동 로그인
을 유지하는 경우가 많고 그 상태에서 메일이나 다른 사이트 이용 중 피싱 사이트
에 접속된다면 공격받을 수 있는것이다. 또한 직접 공격자가 만든 피싱사이트를 통하지 않더라도 XSS
공격이 성공한 사이트를 통해 CSRF
공격이 일어날 수도 있다.
가상 시나리오를 예로 들자면, 페이스북에 로그인 된 상태로 어떤 피싱 사이트의 글을 클릭하여 들어가게 되면, 그 피싱 사이트에 포함된 코드에서 페이스북 사이트에 어떤 글을 올리도록 하는 코드가 실행되게 되어 나도 모르는 사이에 내 계정으로 글이 작성되는 것이다.
CSRF의 방어
CSRF
의 공격 방어에는 대표적으로 Referrer
검증과 Secruity Token
(CSRF Token) 사용이 있다.