본문 바로가기
웹 프로그래밍/SpringSecurity

세션 만료시 로그인 유지 방법

by Backchus 2020. 7. 2.

세션이 만료되더라도 로그인을 유지하는 방법

로그인 과정

  1. 사용자가 로그인 폼에서 로그인 유지 체크박스를 체크한 후 성공적으로 로그인을 하였을 경우 기본적으로 해당 로그인한 유저의 정보에 해당하는 세션 아이디뿐만 아니라 로그인 정보가 담긴 쿠키가 발행됩니다.

  2. 로그인 정보가 담긴 쿠키에는 사용자의 이름과 랜덤으로 생성한 토큰이 포함되어 있다. 사용자 이름과 토큰은 DB 테이블에 저장됩니다.

  3. 로그인하지 않은 사용자가 사이트를 방문하여 로그인 정보가 담긴 쿠키를 제시하면, DB에서 사용자 이름과 토큰이 조회됩니다.

    1. 조회한 사용자 이름과 토큰이 접속한 사용자의 쿠키와 일치하면 인증된 것으로 간주합니다. 그리고 사용된 토큰은 DB에서 제거되고 새로운 토큰이 생성되어 DB에 사용자 이름과 같이 저장됩니다. 그리고 다시 접속한 사용자에게 새로 저장된 토큰과 사용자 이름의 정보가 담긴 쿠키를 반환합니다.
    2. 조회한 사용자 이름과 토큰이 접속한 사용자의 쿠키와 일치하지 않거나 존재하지 않는다면 쿠키는 무시되고 로그인이 되지 않습니다.
  4. 이렇게 로그인 정보가 담긴 쿠키로 로그인을 하는 경우 패스워드 변경, 입/출금 등의 보호되는 정보에는 접근할 수 없습니다. 보호된 정보에 접근하려면 일반적인 로그인 방식으로 아이디와 암호로 로그인을 해야 합니다.

  5. 이러한 접근 방식은 사용자가 다른 브라우저나 컴퓨터에서 로그인을 할 수 있습니니다.


문제점

이이 방법은 한 가지 문제점이 있습니다. 만약 해커가 피해자의 로그인 정보가 담긴 쿠키를 탈취해 피해자가 로그인을 하기 전에 먼저 로그인 시도를 하게 되면 바뀐 토큰 값이 해커에게 돌아가기 때문에 피해자는 더 이상 가지고 있는 쿠키로 로그인을 할 수 없습니다. 공격자는 로그인 정보가 담긴 세션이 만료될 때까지 계속 피해자의 계정에 접근할 수 있습니다.

따라서 이 문제에 대한 해결책은 잘못된 로그인 정보가 담긴 쿠키를 이전에 해커가 성공적으로 로그인을 시도했다는 증거로 다루는 것입니다. 그 증거를 통해서 사용자의 기억된 로그인 세션을 모두 자동으로 무효화 시킬 수 있습니다.


개선된 방법

해커가 성공적으로 T_0을 훔쳐서 사용할 때 T_1을 발급받지만 피해자는 여전히 T_0을 들고 있습니다. 데이터베이스에는 더 이상 T_0이 남아 있지 않습니다.


하지만 토큰 시리즈 자체가 현재의 토큰과 함께 제시되어야 하는 ID가 주어지는 경우, 시스템은 피해자가 유효하지 않은 토큰과 유효한 시리즈 식별자를 제시하고 있음을 알아차릴 수 있습니다.


시리즈 식별자가 토큰 만큼 추측하기 어렵다고 가정할 때, 사용자가 유효하지 않은 토큰을 가진 유효한 시리즈 식별자를 표현하는 유일한 방법은 이전에 유효한 토큰과 함께 유효한 시리즈 식별자인지를 확인하는 것입니다.


이를 위해서는 두 명의 다른 사용자가 동일한 시리즈 식별자와 토큰 쌍을 동시에 보유해야 하며 따라서 도난이 발생했음을 표시해야 합니다.

  1. 사용자가 로그인 폼에서 로그인 유지 체크박스를 체크한 후 성공적으로 로그인을 하였을 경우 기본적으로 해당 로그인한 유저의 정보에 해당하는 세션 아이디뿐만 아니라 로그인 정보가 담긴 쿠키가 발행됩니다.
  2. 로그인 쿠키에는 사용자 이름, 시리즈 식별자(무작위, 변하지 X), 토큰(무작위, 변함)이 포함되어 있습니다. 이 세 개 모두 DB 테이블에 저장됩니다.
  3. 로그인하지 않은 사용자가 사이 방문하여 로그인 쿠키를 제시하면, DB에서 사용자 이름, 시리즈 식별자, 토큰이 조회됩니다.
    1. 사용자 이름, 시리즈 식별자, 토큰이 유효한 경우 사용자가 인증된 것으로 간주합니다. 기존의 토큰은 DB에서 삭제되고 새로운 토큰이 기존 사용자 이름과 시리즈 식별자와 함께 DB에 저장되고 사용자에게 쿠키를 전달합니다.
    2. 사용자 이름과 시리즈 식별자는 유효하지만 토큰이 매치가 되지 않는 경우에는 도난당한 것으로 간주됩니다. 로그인을 시도한 사용자는 강력한 경고를 수신하고 사용자와 관련된 모든 세션이 삭제됩니다.
    3. 만약 사용자 이름과 시리즈 식별자가 존재하지 않는다면 로그인되지 않습니다.

참고 자료: https://www.programering.com/a/MDO0MzMwATA.html