토큰은 보안이슈가 많으니 세션을 사용해야 하나요
어느 날 모의면접에 참관할 기회가 생겨 구경하고있었는데, 당시 면접을 진행해주시던 현직자분께서 이런말을 했었다.
"보통 부트캠프에서는 편의성을 위해 토큰을 이용한 인증, 인가방식을 배우고 사용하는데, 세션으로 구현하는게 더 옳고 더 안전하다."
궁금해졌다. 지금까지 토큰을 이용한 인증인가만을 계속 사용하고있었고 세션은 서버에 무리가 갈 수 있기 때문에 JWT를 이용한 인증 인가방식을 요즘은 많이 사용한다 카더라 라고 얼핏 들었기에 이에 대해 깊게 생각하고 있지 않았었다.
그럼 여기에서 생긴 의문점은 토큰과 쿠키의 단점 (유실, 변조, 도난) 에도 불구하고 왜 쿠키를 사용해야 하는가
HTTP 프토콜과 Cookie
쿠키를 이해하기 앞서 HTTP 통신 특징에 대해 알아야 한다.
HTTP 프로토콜은 연결을 유지시키지 않고 상태가 없는 특성을 가진다.
즉, 서버가 클라이언트 요청에 응답을 하는 순간 HTTP 연결이 끓어진다. 이러한 HTTP 프로토콜의 특징은 웹에서 애플리케이션을 구현하는데 큰 걸림돌이 되었었다. 수많은 요청들 중 서버는 동일한 사용자의 요청을 구별해내기가 쉽지 않았고, 이를 해결하기 위해 쿠키라는 기술이 등장했다고 한다.
쿠키를 한 마디로 정의하면 브라우저와 서버가 HTTP 프로토콜을 이용해서 서버가 어떤 데이터를 브라우저 측에 저장한 후 다시 그 데이터를 받아오는 기술 또는 그 데이터 자체를 뜻한다.
쿠키와 세션의 상호보안
쿠키와 세션을 별개의 기술로 생각하기 쉽지만, 사실 서로 상호보안하는 기술이고 알게모르게 혼용하고 있다.
예를 들어 JWT를 이용한 인증, 인가방식은 사용자가 인증을 통과하면 서버에서는 설정한 시크릿키와 페이로드를 이용해 해싱된 토큰을 발급하고, 사용자는 이를 쿠키에 저장하고 다른 요청 헤더에 첨부해 인가를 진행하게 된다.
세션도 이와 비슷하게 인증을 통과하면 세션을 생성하고, 세션을 식별할 수 있는 고유한 ID를 쿠키에 저장하고 마찬가지로 인가가 필요한 요청에 사용하게 된다.
아니 세션이 더 안전하다며?
또 다시 의문점이 생겼다.
결국 토큰도, 세션 식별자도 쿠키에 보관하기에 탈취위험은 동일해진다.
어차피 동일한 리스크를 감수해야한다면 서버의 자원을 소모하는 세션이 더 안좋은거 아닌가..?
보안적인 관점으로 보면 서버에서 상태관리를 하지 않기에 유효기간이 더욱 한정적인 토큰 인증방식이 더 안전해 보이기까지 한다. 또이또이
굳이 사용하자면 토큰(JWT) 과 세션을 혼용해서 서버에서도 클라이언트의 로그인 상태를 제어할 수 있게 하는정도이지 않을까..?
토큰이 세션보다 보안에 더 취약하다고 일괄적으로 말하는 것은 정확하지 않을 수 있으며, 각 방식의 특징과 요구사항을 이해한 후 그에 맞게 선택 및 구현하는 것이 중요한 것 같다.