Spring Security 2 주 내 자동 로그 인'나 를 기억 해'기능 구현


본 고 는 Spring Security 시리즈 의 한 편 이다.지난 글 에서 저 희 는 User Details Service 와 User Details 인 터 페 이 스 를 실현 함으로써 데이터 베이스 에서 사용자,역할,권한 관련 정 보 를 동적 으로 불 러 와 로그 인 및 권한 수여 와 관련 된 기능 을 실현 합 니 다.이 절 은 이 를 바탕 으로 로그 인 과정 에서 자주 사용 하 는'나 를 기억 해'기능,즉 우리 가 각종 사이트 에 로그 인 할 때 자주 볼 수 있 는'2 주 내 로그 인 면제','3 일 내 로그 인 면제'기능 을 추가 했다.이 기능 의 역할 은 우리 가 로그 인 에 성공 한 후에 일정한 주기 내 에 우리 가 이 사 이 트 를 다시 방문 할 때 다시 로그 인 할 필요 가 없다 는 것 이다.
첫째,가장 간단 한 실천
사실 이 기능 을 실현 하 는 것 은 매우 간단 합 니 다.웹 보안 ConfigurerAdapter 방법 으로 HttpSecurity 를 설정 할 때 remembeMe()방법 을 추가 하면 됩 니 다.다음 코드 에 서 는 Spring Security 로그 인 인증 에 관 한 설정 을 많이 생략 하 였 으 며,이 번 호 는 이전 글 에서 이미 말 하 였 습 니 다)

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.rememberMe();  //           ,          
  }
}
그리고 로그 인 폼 에 checkbox 체크 상 자 를 추가 합 니 다.name 속성의 값 은 현재"remember-me"이 어야 합 니 다.

<label><input type="checkbox" name="remember-me"/>    </label>
이렇게 간단 해서 우 리 는 나의 기능 을 기억 하 는 것 을 실현 했다.기본 효 과 는 2 주 내 에 로그 인 을 면제 하 는 것 이다.
2.실현 원리
많은 친구 들 이 위의 실현 과정 을 보고 마음 이 멍 해 졌 는 지 이렇게 이 루어 졌 습 니까?이 과정 에서 어떤 일 을 했 는 지 설명해 드 리 겠 습 니 다.
4.567917.우리 가 로그 인 할 때 사용자 이름,비밀 번 호 를 제외 하고 remember-me 도 선택 할 수 있 습 니 다
  • 만약 에 우리 가 remember-me 를 선택 하면 로그 인 에 성공 하면 서버 에서 쿠키 를 생 성하 여 브 라 우 저 에 게 되 돌려 줍 니 다.이 쿠키 의 이름 은 기본적으로 remember-me 입 니 다.값 은 token 영패 입 니 다
  • 우리 가 유효기간 내 에 응용 프로그램 에 다시 접근 할 때 Remember MeAuthenticationFilter 를 통 해 쿠키 의 token 을 읽 고 검증 합 니 다.다시 로그 인하 지 않 아 도 응용 접근 이 가능 합 니 다
  • 이 token 토 큰 은 MD5 hash 문자열 입 니 다.username,expirationTime,passwod 와 미리 정 의 된 key 를 포함 하고 MD5 를 통 해 암호 화 합 니 다.어떤 친구 들 은 이렇게 안전 하 냐 고 물 을 수도 있다.쿠키 가 납치 되면 안전 하지 않 을 것 입 니 다.다른 사람 이 이 문자열 을 받 으 면 유효기간 내 에 응용 프로그램 에 접근 할 수 있 습 니 다.이것 은 당신 의 열쇠 token 이 도 둑 맞 은 것 과 같 습 니 다.당신 집 은 틀림없이 안전 하지 않 을 것 입 니 다.그러나 암호 가 명문 으로 해 제 될 가능성 은 없고 MD5 hash 는 거 스 를 수 없습니다.

    Remember MeAuthenticationFilter 는 Spring Security 필터 체인 에서 전체적으로 뒤 처 진 위치 에 있 기 때문에 각종 전통 적 인 로그 인 방식 이 검증 을 완료 하지 못 한 경우 에 만 Remember MeAuthenticationFilter 를 가 는 것 도 실제 수요 에 부합 한다.
    3.개성 화 된 설정
    실제 개발 과정 에서 우 리 는 수요 에 따라 개성 화 된 설정 을 할 수 있다.다음 과 같다.
    
    .rememberMe()
      .rememberMeParameter("remember-me-new")
      .rememberMeCookieName("remember-me-cookie")
      .tokenValiditySeconds(2 * 24 * 60 * 60); 
    token Validity Seconds 는 token 의 유효기간 을 설정 하 는 데 사 용 됩 니 다.즉,몇 시간 안에 중복 로그 인 을 면제 할 수 있 습 니까?단 위 는 초 입 니 다.설정 을 수정 하지 않 은 상태 에서 기본 값 은 2 주 입 니 다.
    rememberMeParameter 를 통 해 from 폼 의'자동 로그 인'체크 상자 의 매개 변수 이름 을 설정 합 니 다.여기 서 바 뀌 면 from 폼 에서 checkbox 의 name 속성 에 대응 하 는 변경 사항 입 니 다.기본 값 을 설정 하지 않 으 면 remember-me 입 니 다.
    rememberMeCookieName 은 브 라 우 저 에 저 장 된 쿠키 의 이름 을 설정 합 니 다.기본 값 을 설정 하지 않 으 면 remember-me 입 니 다.다음 그림 에서 브 라 우 저의 쿠키 를 보십시오.

    4.token 데이터베이스 저장 방식
    위 에서 우리 가 말 한 방식 은'나 를 기억 해-자동 로그 인'기능 을 가장 간단하게 실현 하 는 방식 이다.이러한 방식 의 단점 은 token 과 사용자 의 대응 관 계 는 메모리 에 저장 되 어 있 습 니 다.우리 가 응용 프로그램 을 다시 시작 하면 모든 token 이 사라 집 니 다.즉,모든 사용자 가 다시 로그 인해 야 합 니 다.이 를 위해 Spring Security 는 token 을 데이터베이스 에 저장 하 는 방식 도 제공 해 주 었 고 응용 을 다시 시작 하 는 데 도 영향 을 받 지 않 습 니 다.
    어떤 글 은 데이터베이스 저장 방식 을 사용 하 는 것 은 이런 방식 이 더욱 안전 하기 때 문 이 라 고 말 하 는데 필 자 는 그렇게 생각 하지 않 는 다.데이터베이스 에 저 장 된 token 은 사용자 이름,비밀번호 MD5 암호 화 문자열 이 아니 라 무 작위 시리 얼 번호 입 니 다.하지만 랜 덤 번호 쿠키 가 납치 되면 효 과 는 같 습 니 다.마치 너의 집에 비밀번호 자물쇠 가 있 는 것 과 같다.네가 열 쇠 를 잃 어 버 린 것 은 네가 비밀 번 호 를 잃 어 버 린 것 과 위해 성 은 같다.

    위의 그림 은 token 데이터베이스 저장 방식 의 실현 원리 와 검증 과정 입 니 다.다음은 우리 가 실현 하 겠 습 니 다.우선,데이터베이스 시트 persistent 를 눌 러 야 합 니 다.logins:
    
    CREATE TABLE `persistent_logins` (
     `username` varchar(64) NOT NULL,
     `series` varchar(64) NOT NULL,
     `token` varchar(64) NOT NULL,
     `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     PRIMARY KEY (`series`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    PersistentTokenRepository 형식의 Spring bean 을 초기 화하 고 시스템 에서 사용 하 는 DataSource 를 이 bean 에 주입 합 니 다.(물론 전 제 는 Spring Boot 의 application.yml 에 DataSource 와 관련 된 연결 속성 을 설정 한 것 입 니 다.더 이상 언급 하지 않 습 니 다)
    
    @Autowired
    private DataSource dataSource;
     @Bean
     public PersistentTokenRepository persistentTokenRepository(){
       JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
       tokenRepository.setDataSource(dataSource);
       return tokenRepository;
     }
    마지막 으로 Spring Security 설정 방법 configure(HttpSecurity http)에 다음 과 같은 맞 춤 형 설정 을 추가 합 니 다.
    
    .rememberMe()
      .tokenRepository(persistentTokenRepository())
    총결산
    위 에서 설명 한 것 은 편집장 님 께 서 소개 해 주신 Spring Security 가 2 주 내 에 자동 로그 인'나 를 기억 해'기능 을 실현 하 는 것 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
    만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

    좋은 웹페이지 즐겨찾기