내일배움캠프 TIL (230221): 웹해킹 / 세션 vs. jwt 토큰

Jiumn·2023년 2월 21일
0

XSS 공격 vs. CSRF 공격

쿠키와 세션에 대해 공부하다보니 자주 등장하는 단어 XSS 공격과 CSRF 공격에 대해 알아봤다.

- XSS(Cross Site Scripting): 공격자가 웹 사이트에 개발자가 의도치 않은 스크립트를 넣어 실행시키는 웹 해킹 방법. 예를 들어 게시판에 악성 스크립트가 담긴 글을 올리고 사용자가 클릭하면 쿠키 정보를 탈취하는 등 사용자에게 직접적으로 해를 가하는 방법.

XSS를 막기 위한 방법에는 쿠키에 httponly 속성을 다는 방식을 사용하거나 쿠키에 중요한 정보를 담지 않고 이를 서버에 저장하는 방식 등이 있다.

- CSRF(Cross Site Request Forgery): XSS가 클라이언트에 발생하는 문제라면 CSRF는 서버에 발생하는 문제. 클라이언트가 공격자의 url을 클릭해서 악의적인 코드가 실행되고 서버는 이를 정상적으로 처리하여 공격자의 의도대로 해킹되는 방법.

CSRF를 막기 위한 방법에는 CAPCHA(이미지 혹은 오디오를 주고 사람인지 악성봇인지 판별하게 하는 방법), CSRF Token 등이 있다.


세션 vs. jwt 토큰, 어떤 게 더 안전한가?

그렇다면 여기에서 궁금해지는 점은 세션 방식이 JWT 토큰을 이용하는 방식보다 안전한 인증 방식인가 하는 점이다.

세션ID 역시 쿠키로 실어보내기 때문에 세션 하이재킹과 같은 웹 해킹 방식으로 탈취가 가능하다.

그래서 구글링을 하다가 다음과 같은 글을 찾게 되었다.

그러므로 이제는 앱이나 웹브라우저에서 토큰이나 탈취되면 session보다 위험하다는 얘기는 반쪽짜리 이야기라는 것이다.
그럼 차이가 나는 부분은 어디냐.
앞서 말했던 stateful과 stateless에서 차이가 나는것이다. 즉 토큰 탈취시 서버에서 능동적으로 토큰을 expire할 수 있느냐 없느냐에 대한 부분이라고 볼 수 있다고 본다.

결국 세션ID는 서버에 저장되어 있기 때문에 탈취를 당한다고 하더라도 서버에서 직접 세션ID를 만료시킬 수 있다는 점 때문에 보안에 더 유리하다는 것이다. jwt 토큰은 클라이언트에 저장되므로 서버에서 강제적으로 만료시킬 방법이 없다.

그렇다면 왜 jwt 토큰을 사용하는 걸까?

그런데 글을 더 읽다 보니 사실 jwt 토큰과 세션은 이렇게 간단한 문제가 아니라 웹과 앱의 차이까지 발전되어 나간다. 기존 웹은 사용자가 본인의 PC에서만 접속한다는 보장이 없지만, 앱의 경우 자신만의 것이라는 점이 대체로 보장된다. 따라서 세션처럼 일정 시간이 지나면 매번 로그아웃을 시키는 것이 사용자 입장에서는 번거로운 일이 될 수 있다.

또한, 트래픽이 급증하는 서비스의 경우 세션 DB를 사용하게 되면 DB를 계속적으로 증설해야 하는 어려움이 있기 때문이다. 이때 토큰 방식을 사용하면 DB 증설 없이도 사용자를 빠르게 인증할 수 있게 된다.

하지만 앞서 설명한 토큰 인증 방식의 문제점 때문에 refresh 토큰 방식이 나오게 된 것이다.

(* 참고: 토큰과 세션(3) - 선택)

(기본적으로 앱에서는 세션 유지를 통한 인증 방식을 구현할 필요가 없다고 한다. 그 이유까지 설명하기엔 범위를 벗어나고 내용이 너무 방대해지므로 여기서는 생략한다.)

다시 정리하면, 세션과 jwt 모두 클라이언트의 쿠키에 저장되므로 탈취의 위험은 있다. 다만 세션은 탈취 시 서버에서 제어가 가능하지만 jwt 토큰은 그럴 수 없으므로 보안에 좀 더 취약하다고 표현된다. 하지만 jwt 토큰은 트래픽이 급증하는 서비스에서 DB 증설 없이 사용자 인증을 안정적으로 할 수 있고, refresh 토큰과 같은 방식으로 보안도 가능하기 때문에 요즘 선호되고 있다.

사실 지금까지 공부한 내용은 튜터님과 상담 중 'jwt 토큰은 왜 서버(세션)에 저장하지 않는가?'라는 질문에서 시작된 것이었다. 공부한 내용을 바탕으로 나름의 답을 내리자면 'jwt 토큰은 애초에 서버에 저장되는 것의 문제점을 해결하기 위해 나온 것이기 때문에 서버에 저장한다면 그 장점을 잃게 된다'는 것이다.

profile
Back-End Wep Developer. 꾸준함이 능력이다. Node.js, React.js를 주로 다룹니다.

1개의 댓글

comment-user-thumbnail
2023년 2월 21일

최종프로젝트때 스크립트태그 공격예정입니다..! 막아보셔요!

답글 달기