Post

Spring Security Session방식과 JWT 방식의 차이

최근 면접을 보면서 Spring Security에서 Session 방식과 JWT 방식의 차이점을 상태유지 관점에서 설명해달라는 질문을 들었다. 나는 동작방식에 대해서만 알았는데 상태유지 관점이라니.. 면접이 끝나고 면접 질문들을 복기하면서 찾아보았다. 그저 머리로만 알고 있었던 내용을 정리하면서 새로운 내용도 알아보려 한다.

Spring Security

Spring Security는 인증, 권한 관리 그리고 데이터 보호 기능을 포함하여 웹 개발 과정에서 이용자 관리 기능을 구현하는데 도움을 주는 프레임워크이다. 인증과 권한에 대해 Filter 흐름에 따라 처리하고 있으며 보안과 관련해서 많은 옵션을 제공해주고 있기 때문에 개발자가 일일이 보안 로직을 작성하지 않아도 된다는 장점이 있다.


인증과 인가

  • 인증(Authentication) : 사용자가 누구인지 확인하는 절차(ex. login)
  • 인가(Authentication) : 인증된 사용자가 요청한 자원에 접근 가능한지 권한을 확인하는 절차


Session 방식

UserDetails 인터페이스를 구현한 클래스를 정의한다. 시큐리티가 로그인 진행을 완료하면 시큐리티 session을 만들어서 ContextHolder에 저장한다. session은 Authentication 타입 객체여야 한다. Authentication 안에는 User 정보가 있고 이 또한 UserDetails 타입 객체여야한다.

동작 과정

  • 최초 클라이언트가 ID, PW로 로그인 요청 시 서버에서 세션을 만들고 세션 ID를 클라이언트에게 응답
  • 클라이언트는 로컬 스토리지에 세션 ID를 저장하고 앞으로 서버에게 요청 시 세션ID를 같이 실어서 보냄
  • 서버는 세션ID 확인 후 인증 페이지로 안내


JWT토큰 인증 방식

JWT란?

Json Web Token의 약자로 Json 객체로 어떤 정보를 안전하게 전송하기 위한 방식이다. 이 정보는 디지털 서명이 되어있으므로 신뢰할 수 있다. 서명하는 방법은 HS256 (HMAC with SHA-256) 해쉬 알고리즘 또는 RS256 (RSA Signature with SHA-256) 알고리즘을 사용한다. 이렇게 서명된 토큰은 그 안에 포함된 클레임의 무결성을 확인할 수 있게 해준다.

데이터베이스 무셜성: 데이터베이스에서 데이터가 정확하고 일관성 있게 유지되는 것


동작 과정

  • 클라이언트가 ID, PW로 로그인 요청
  • 서버는 정상적으로 로그인됐을 시 토큰 응답
  • 클라이언트는 로컬 스토리지에 토큰을 저장
  • 클라이언트는 서버에 요청할 때마다 header의 Authorization에 토큰을 담아 보냄
  • 서버는 내가 만든 토큰인지만 확인


Session vs JWT

JWT는 서버에서 Session에 대한 정보를 통제할 필요가 없다. 세션은 다중 서버를 운영할 시에, 세션 A는 서버 A에만 존재하므로 서버 A가 장애가 발생하면 서버 B에는 세션 A를 새로 할당해야한다.


Session

장점

  • 서버 측에서 세션을 관리 -> 사용자 정보를 저장하거나 처리하는 데 필요한 모든 정보를 저장할 수 있음
  • 세션 정보가 서버 측에 저장되므로 브라우저나 모바일 앱의 메모리를 절약

단점

  • 서버의 확장성이 제한
    • 각 서버가 사용자 세션 정보를 유지하고 있어야 하므로, 서버 수가 증가하면 세션 복제 및 동기화 문제가 발생할 수 있음
  • 세션 정보를 저장하고 검색하는 데 필요한 리소스가 많아질 수 있음


JWT

장점

  • 상태를 저장하지 않기 때문에 서버의 확장성이 좋음
  • 모바일 앱과 같이 세션에 대한 저장 공간이 없는 경우 유용
  • 일반적으로 더 간단하고 적은 오버헤드로 작동
  • 토큰에는 권한 정보가 포함 -> 서버에서 권한 확인에 필요한 데이터베이스나 다른 인프라에 대한 호출을 줄일 수 있음
  • 토큰이 서명되어 있기 때문에 변조될 가능성이 적음

단점

  • 토큰에 대한 전송 보안을 유지해야 하므로 HTTPS를 사용
  • 토큰의 크기가 커질 경우, 네트워크 전송 및 저장소에 대한 부담이 증가
This post is licensed under CC BY 4.0 by the author.