TIL - 0725

[프로젝트 개발] spring-security OAuth2 - JWT

어제까지 개발한 것 정리

  • 어제까지 클라이언트가 인증서버에 인증을 하면 redirect 되어서 액세스코드가 서버로 가게 해놨음, 어플리케이션 서버는 인증서버에 액세스코드 검증 후 JWT를 발급해주는 것까지 만듦
  • 오늘은 만든 JWT를 클라이언트가 응답받아서 어떻게 보관할지에 대해서 공부하고 개발하면 됨 - 두가지 방법 중 1가지를 택, 장단점을 확실히 파악해야함
    • secure, HttpOnly 쿠키 사용
    • 클라이언트(브라우저) 로컬 스토리지 사용

XSS와 HTTP Only 쿠키 그리고 CSRF

XSS

  • 크로스 사이트 스크립팅(XSS) : 악의적인 사용자가 스크립트를 심어놓고(게시판 등) 유저들이 심어놓은 스크립트를 실행했을 때 악의적인 사용자가 유도한 웹사이트로 이동하게하여 유저의 정보를 탈취하는 공격 기법
    • 쿠키(세션)을 탈취해서 사용자인 척 행동할 수 있음 : 자바스크립트 API를 통해 읽어올 수 있어서 쿼리스트링으로 전달 가능
    • 글쓰기 할 때 input 태그에 입력된 스크립트를 innerHTML로 붙이고 보여줄 경우 스크립트가 그대로 입력되는 것을 테스트로 볼 수 있었음(또다른 방법이 있는지 체크해보기)
    • 공격 기법 : 태그 넣기, js 코드 넣기, 아스키코드로 변환해서 넣기, 이미지 태그에 넣기, Iframe으로 넣기

XSS 공격 해결 방법 - HTTP Only 쿠키

  • HTTP Only 쿠키 : 자바스크립트 API를 통해서 쿠키를 가져올 수 없도록 - XSS를 시도하는 스크립트에서 값 전달을 할 수 없음
    • 서버에서 쿠키를 생성하고 setSecure(true) 설정을 해주면 클라이언트에서는 자바스크립트 API로 해당 쿠키를 읽을 수 없음
cookie.setSecure(true);

CSRF

  • HTTP Only 쿠키 사용으로 세션 탈취는 못하더라도 스크립트 작성은 가능할 때 유저가 악의적인 사용자에 의도에 맞게 행동하도록 할 수 있음
    • GET 방식으로 글쓰기 작업과 같이 데이터를 넘겨줘서 생성하는 작업을 지원할 때 해당 공격 가능
    • 악의적인 사용자의 글을 읽었을 때 글쓰기 패스로 이동하게 만들고, 쿼리스트링으로 글쓰기에 필요한 값을 전달할 때 공격이 이뤄지게 됨

CSRF 공격 해결방법 - 스크립트 작성을 못하도록 하기

  • 글쓰기와 같이 생성하는 액션(API)을 POST로 만들 것
  • 서버에서 필터링하기 : 아예 자바스크립트를 포스트 내에 심을 수 없도록 생성되는 과정에서 스크립트 태그로 사용되지않도록 처리 해야함
    • 서블릿 필터로 스크립트 관련 텍스트인지 판단 후 일반 텍스트로 처리하도록 해야함