세션은 사용자가 웹사이트에 로그인했을 때 사용자에 대한 정보를 일정 기간 동안 서버에 기록하고 보관함으로써 사용자를 관리하기 위한 목적으로 사용되는 개념인데 이는 특정 데이터를 저장하는 공간 혹은 운영체제가 어떤 사용자로부터 자신의 자산 이용을 허락하는 일정한 기간을 뜻합니다. 대부분은 기간을 뜻하지만 두 가지 의미에 대해 인지하고 있는 것이 좋습니다.
세션은 피시방을 생각해보면 쉽습니다.
사용자 로그인 및 세션 시작
사용자가 피시방 컴퓨터에 로그인하면 세션이 시작됩니다. 사용자의 로그인 정보 및 세션 상태는 서버에 저장됩니다.
사용자 정보 저장
사용자의 회원 정보는 서버에 저장되어 있습니다. 로그인 시 세션에 사용자 정보를 로드하고, 이 정보를 통해 사용자를 식별하고 서비스를 제공합니다.
사용자의 행동 추적
사용자의 피시방에서의 활동(프로그램 사용, 웹사이트 방문 등)이 세션 동안에 추적되어 서버에 기록됩니다. 이는 필요한 경우 관리자가 사용자의 활동을 확인할 수 있도록 합니다.
세션 기간과 사용 시간
사용자가 충전한 시간 동안 세션이 유지됩니다. 세션 기간 동안 사용자는 피시방 서비스를 이용할 수 있습니다. 충전한 시간이 소진되면 자동으로 로그아웃되며 세션은 종료됩니다.
자동 로그아웃
사용자가 충전한 시간이 모두 소진되면, 자동으로 로그아웃이 되어 세션이 종료됩니다. 이로써 다음 사용자가 로그인하여 새로운 세션을 시작할 수 있게 됩니다.
로그아웃 시 사용자 정보 삭제
사용자가 로그아웃하면 해당 세션에 연결된 사용자 정보는 삭제됩니다. 컴퓨터에서 사용한 프로그램 및 웹사이트 정보도 사용자 로그아웃 시 삭제됩니다. 사용자와 컴퓨터 사이의 통신이나 컴퓨터 간 통신을 위해서 활성화된 접속 상태가 세션입니다.
세션은 서버 측에서 사용자 상태를 관리하는 데 사용되는 도구이며, 사용자의 활동을 추적하기에 용이합니다. 주로 서버 메모리나 데이터베이스에 저장됩니다.
접속 상태 관리
세션은 서버에서 웹사이트를 사용하는 사용자의 접속 상태를 관리합니다.
세션 아이디
사용자와 서버 간에 주고받는 식별자로 세션 아이디가 사용됩니다. 중간에 해당 아이디와 값을 빼앗겨도 빼앗긴 세션 ID만 있어도 사용자의 개인정보를 알 수 없습니다.
세션의 지속 기간 제한
세션은 일정 기간이 지나면 만료되고 사라집니다. 이를 통해 보안을 유지할 수 있습니다.
서버에서 관리
세션은 서버에서 저장되어 관리되므로, 사용자가 많을수록 부하가 발생할 수 있습니다.
데이터베이스 조회
사용자에 대한 정보가 필요할 때마다 서버의 데이터베이스에서 조회를 해야 합니다.
로드 밸런싱의 어려움
여러 개의 서버를 사용하는 구조에서는 세션의 관리가 어려울 수 있습니다.
사용자가 웹사이트에 로그인하면, 서버에서 사용자의 로그인 정보와 데이터베이스에 저장된 사용자 정보를 비교합니다.
사용자가 존재하고 정보가 일치하면, 세션 ID와 사용자에 대한 일부 정보를 서버의 세션 저장소에 저장하고, 서버에서는 해당 세션 ID값을 사용자에게 Session Cookie 값으로 전달합니다.
사용자가 다시 웹사이트에 접속할 때, 세션 ID 값을 같이 보내면 서버에서는 세션 저장소에서 세션 ID를 조회하여 사용자를 식별하고, 사용자에 맞는 서비스를 제공합니다.
세션은 서버 리소스를 사용하는 형태이기 때문에, 무분별한 사용은 서버의 메모리에 부하를 일으킬 수 있습니다. 이를 해결하기 위해 쿠키를 사용할 수 있으며, 쿠키는 속도가 빠르기 때문에 효율적일 수 있습니다. 그러나 쿠키는 브라우저에 저장되는 구조이기 때문에 서버에 저장되는 세션에 비해 상대적으로 보안성이 취약하다는 특징이 있습니다.
일반적으로 토큰은 사용자의 인증을 담당하며, 해당 토큰을 통해 사용자의 신원을 확인하고 권한을 부여합니다. 사용자의 활동 추적에 대한 부분은 토큰이 아니라 세션과 관련이 있습니다.
토큰은 클라이언트 측에서 상태를 저장하며, 주로 브라우저의 쿠키나 로컬 스토리지에 저장됩니다. 토큰은 주로 사용자의 인증 및 권한 부여에 중점을 두며, 특히 웹 애플리케이션에서 API 호출 시 사용되는 경우가 많습니다.
토큰은 보안 등급카드를 생각해보면 쉽습니다.
보안 등급카드
사용자가 시설에 출입하거나 특정 정보에 접근할 권한을 얻기 위해 보안 등급카드를 발급받습니다. 해당 카드에는 사용자의 신원과 부여된 권한이 기록되어 있습니다. 카드를 제시하면 시설의 출입문이나 특정 영역에 접근할 수 있습니다.
토큰
사용자가 로그인하면 서버에서 토큰이 발급됩니다. 이 토큰에는 사용자의 식별 정보와 부여된 권한이 포함되어 있습니다. 이를 통해 특정 서비스나 리소스에 접근할 수 있습니다.
보안 등급카드
보안 등급카드를 제시하면 시설 관리자는 카드에 기록된 정보를 확인하고 사용자의 신원을 확인한 후 해당 사용자에게 부여된 권한에 따라 출입을 허용하거나 제한할 수 있습니다.
토큰
서버는 클라이언트가 제시한 토큰을 확인하여 사용자의 신원을 확인하고, 토큰에 부여된 권한을 기반으로 해당 사용자에게 서비스를 제공하거나 제한합니다.
보안 등급카드
일반적으로 보안 등급카드에는 유효 기간이 있으며, 만료되면 재발급이 필요합니다.
토큰
토큰에도 일정 기간 동안 유효한 기간이 있으며, 만료되면 새로운 토큰을 발급받아야 합니다.
접속 상태 관리
토큰 기반의 인증은 세션과 달리 클라이언트 측에서 상태를 관리하며, 서버는 상태를 저장하지 않고, 사용자의 상태를 토큰 내에 포함시킵니다. 이는 Stateless한 특성을 가집니다.
JWT (JSON Web Token)
토큰은 주로 JWT와 같은 형식을 사용하며, 정보를 안전하게 전송하고 저장할 수 있습니다. 토큰은 헤더, 페이로드, 시그니처로 구성됩니다. 토큰에는 유저에 대한 정보, 만료 기간 등이 포함될 수 있습니다.
서버 부하 감소
서버는 토큰을 검증하고 필요한 정보를 토큰에서 가져오기만 하면 되기 때문에, 세션에 비해 서버 부하가 적습니다.
데이터베이스 조회 최소화
토큰은 자체적으로 정보를 포함하고 있기 때문에, 필요한 정보를 따로 조회할 필요가 없습니다.
로드 밸런싱 쉬움
토큰은 서버의 상태를 저장하지 않기 때문에 여러 서버 간의 상태 공유가 용이하며 로드 밸런싱에 유리합니다.
유연성
토큰은 클라이언트 측에서 저장되기 때문에, 다양한 플랫폼과 언어 간에 쉽게 교환될 수 있습니다.
보안성 강화
토큰은 서명과 암호화를 통해 정보의 무결성을 보장하고, 서버에 저장되지 않고 클라이언트에 저장되기 때문에, 세션이나 쿠키와 달리 서버에서 보안성을 강화할 수 있습니다.
인증 요청
사용자가 로그인 요청을 하면, 서버는 사용자의 인증 정보를 확인합니다.
토큰 생성 및 전달
인증이 성공하면 서버는 사용자의 정보를 포함한 토큰을 생성하고, 클라이언트에게 전달합니다.
토큰 저장
클라이언트는 토큰을 안전한 위치(로컬 스토리지, 쿠키 등)에 저장합니다.
토큰을 통한 요청
사용자가 서비스를 이용하는 동안, 클라이언트는 저장된 토큰을 요청 헤더에 포함하여 서버에 전송합니다.
토큰 검증 및 서비스 제공
서버는 토큰을 검증하고, 필요한 정보를 토큰에서 가져와 사용자를 식별하여 서비스를 제공합니다.
토큰 갱신
토큰은 일정 기간이 지나면 만료됩니다. 만료 전에 사용자가 계속 서비스를 이용하면, 서버는 새로운 토큰을 발급하여 전달합니다.