• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

로그아웃 시, 토큰 만료 처리

23.12.12 20:14 작성 조회수 359

0

  1. 로그아웃 시, 토큰 만료 처리

로그아웃 할 때, 토큰 무효화를 확실히 하기 위해 oauth2_authorization 테이블에 있는 액세스 토큰과 리프레시 토큰을 만료 시키고 싶은데 맞는 방법인지 모르겠습니다.

로그아웃url 뒤에 쿼리로 액세스 토큰, 리프레시 토큰 받아와 커스텀한 logoutHandler에서 OAuth2AuthorizationService 호출하여 토큰 유효기간을 업데이트 하여 무효화하긴 했는데

위 방법처럼 DB의 oauth2_authorization 테이블을 직접 업데이트쳐서 토큰을 무효화 해도 되는것인지,
Spring boot 내에서 왜 로그아웃할 때 토큰 유효기간을 만료시키지 않는 것인지 궁금합니다.

 

  1. 로그인 시, 세션 인증 정보 저장

그리고 로그인할 때 OAuth2AuthorizationServerConfigurer내부에서 세션에 인증 정보(유저명, 인증여부 등)담고 있는데 인증서버를 여러 대 구성할 경우, 문제가 없을지? redis를 사용해야할지 궁금 합니다.

oauth2는 토큰발급하여 인가하는데 왜 세션에 인증정보를 저장하여 사용하나요?

답변 2

·

답변을 작성해보세요.

1

  1. 로그아웃 시, 토큰 만료 처리

네 현재 클라이언트가 로그아웃 할 경우 스프링 인가서버의 세션이나 토큰을 만료시키는 엔드포인트는 제공되고 있지 않습니다.

강의에서 보면 keycloak 인가서버 같은 경우 OIDC 방식으로 인증이 된 경우 로그아웃 시 세션이 만료되는 엔드포인트가 제공되고 있음을 알 수 있는데 스프링 인가서버에서는 클라이언트 로그아웃 시 인가서버의 로그아웃과 서로 연동 될 수 있는 엔드포인트가 지원되지 않고 있습니다.

다만 최신 인가서버 버전에서는 이 기능이 지원되고 있는지는 정확하게 확인하지 못했습니다.

대신 스프링 인가서버에서 토큰을 해지 할 수 있는 엔드포인트는 제공하고 있습니다.

즉 클라이언트의 로그아웃 시 토큰을 해지 함으로 더 이상 토큰을 사용하지 못하도록 할 수 는 있으나 이것도 세션을 만료시키는 것은 아닙니다.

그리고 인가 서버의 세션을 클라이언트에서 강제로 만료 시킬수는 없습니다.

 

  1. 로그인 시, 세션 인증 정보 저장

네 서버가 여러 대이면 Redis 와 같은 세션 공유 서버를 두거나 서버간 세션 클러스터링을 해야 합니다.

그리고 인증 정보를 세션에 저장하는 이유는 토큰을 발급받기 위해서는 사용자의 승인이 필요합니다.

그리고 토큰이 만료되었을 경우 재발급 받을 시에 사용자의 승인을 계속 유지하기 위해서는 세션이나 쿠키 같은 곳에 정보를 저장해야 합니다.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.12.14

안녕하세요, 인프런 AI 인턴입니다.

찰삭찰리 초콜렛님, 로그아웃 시 OAuth2 액세스 토큰과 리프레쉬 토큰을 만료시키는 것은 맞는 방법인지에 대한 질문을 주셨군요.

Spring Security에서는 일반적으로 OAuth2 액세스 토큰을 저장하거나 무효화하는 기본적인 메커니즘을 제공합니다. 하지만, Spring Boot 내에서 로그아웃 시 액세스 토큰의 유효 기간을 자동으로 만료시키지 않는 이유는, 애플리케이션의 요구 사항이나 보안 정책에 따라 다를 수 있기 때문입니다. 따라서 개발자가 필요에 따라 직접 로그아웃 핸들러를 커스터마이징하여 토큰을 만료시키는 로직을 구현할 수 있습니다. 기존의 oauth2_authorization 테이블을 업데이트하여 토큰을 무효화하는 것은 가능한 방법이지만, 이는 시스템의 전반적인 보안 정책과 연계하여 신중하게 결정되어야 합니다.

로그인 시에는 OAuth2AuthorizationServerConfigurer를 사용하여 세션에 인증 정보를 저장하는 것과 관련하여, 인증 서버를 여러 대 구성할 경우 세션 정보를 어떻게 관리해야 할지에 대한 궁금증을 표현하셨습니다. 분산 환경에서의 세션 관리는 고가용성과 스케일아웃을 고려해야 하므로, 세션 정보를 공유하는 메커니즘을 사용해야합니다. 이 경우 Redis와 같은 외부 세션 저장소를 사용하여 세션을 관리하는 것이 일반적입니다. OAuth2가 토큰 기반으로 동작함에도 세션을 사용하는 이유는, 궁극적으로 인증 상태를 유지하기 위한 부가적인 방법으로서, 각 애플리케이션의 구조나 보안 요구 사항에 따라 다를 수 있습니다.

마지막으로 Spring Security 관련 문서를 참고하여 추가적인 정보를 얻고자 하시면 아래 링크를 활용해 보시길 권장합니다.

도움이 되셨기를 바라며, 추가적인 질문이 있으시다면 언제든 문의해 주세요.