Spring Security 학습 의 remembeMe 자동 로그 인 실현

머리말
자동 로그 인 은 사용자 의 로그 인 정 보 를 사용자 브 라 우 저의 쿠키 에 저장 하고 사용자 가 다음 에 방문 할 때 자동 으로 검 사 를 실현 하고 로그 인 상 태 를 구축 하 는 메커니즘 입 니 다.
Spring Security 는 두 가지 아주 좋 은 토 큰 을 제공 합 니 다.
  • 해시 알고리즘 은 사용자 에 게 필요 한 로그 인 정 보 를 암호 화하 고 토 큰 을 생 성 합 니 다
  • 데이터베이스 등 지속 적 인 데이터 저장 체제 에 사용 되 는 지속 적 인 토 큰
    해시 암호 화 방안
    Spring Security 에 자동 로그 인 기능 을 추가 하 는 것 은 매우 간단 합 니 다.
    
     @Override
     protected void configure(HttpSecurity http) throws Exception {
     http.authorizeRequests()
      .antMatchers("/api/user/**").hasRole("user") //user     /api/user/     
      .antMatchers("/api/admin/**").hasRole("admin") //admin     /api/admin/     
      .antMatchers("/api/public/**").permitAll()   //        /api/public/     
      .and()
      .formLogin()
      .and()
      .rememberMe().userDetailsService(userDetailsService()); //    
     }
    서 비 스 를 다시 시작 한 후 제 한 된 API 에 접근 합 니 다.이번 에는 폼 로그 인 페이지 에 선택 가능 한 상자 가 하나 더 생 겼 습 니 다.

    "Remember me on this computer"옵션 상 자 를 선택 하고 정상 적 인 절차 에 따라 로그 인하 고 개발 자 도구 에서 브 라 우 저 쿠키 를 보면 JSESSIONID 를 제외 한 값 이 하나 더 있 음 을 볼 수 있 습 니 다.

    Spring Security 의 기본 자동 로그 인 쿠키 필드 입 니 다.설정 하지 않 은 상태 에서 만 료 시간 은 2 주일 입 니 다.

    Spring Security 는 매번 폼 로그 인 에 성공 한 후에 이 토 큰 을 업데이트 합 니 다.구체 적 인 처리 방식 은 원본 코드 에 있 습 니 다.


    RememberConfigurer:


    영구 화 토 큰 방안
    영구 화 토 큰 방안 에서 가장 핵심 적 인 것 은 series 와 token 두 값 입 니 다.모두 MD5 로 산 열 된 무 작위 문자열 입 니 다.다른 것 은 series 는 사용자 가 비밀 번 호 를 사용 하여 다시 로그 인 할 때 만 업데이트 되 고 token 은 모든 새로운 session 에서 다시 생 성 됩 니 다.
    해시 암호 화 방안 의 토 큰 이 여러 단 에 동시에 로그 인 할 수 있 는 문 제 를 해결 하 였 습 니 다.모든 세 션 은 token 의 업 데 이 트 를 가 져 옵 니 다.즉,모든 token 은 하나의 인 스 턴 스 로그 인 만 지원 합 니 다.
    자동 로그 인 은 series 변경 을 초래 하지 않 습 니 다.매번 자동 로그 인 할 때마다 series 와 token 두 값 을 동시에 검증 해 야 합 니 다.이 토 큰 이 자동 로그 인 을 사용 하지 않 고 도 둑 맞 았 을 때 시스템 은 불법 사용자 인증 이 통 과 된 후에 token 값 을 새로 고 칩 니 다.이때 합 법 적 인 사용자 의 브 라 우 저 에서 이 token 값 은 이미 효력 을 잃 었 습 니 다.합 법 적 인 사용자 가 자동 로그 인 을 사용 할 때 이 series 에 대응 하 는 token 이 다 르 기 때문에 시스템 은 이 토 큰 이 도 용 된 것 으로 추정 하여 처리 할 수 있 습 니 다.예 를 들 어 이 사용자 의 모든 자동 로그 인 토 큰 을 정리 하고 도 난 당 했 을 수도 있다 는 것 을 알 리 는 등 이다.
    Spring Security 는 PersistentRemember MeToken 을 사용 하여 인증 실 체 를 표시 합 니 다.
    
    public class PersistentRememberMeToken {
     private final String username;
     private final String series;
     private final String tokenValue;
     private final Date date;
    
     public PersistentRememberMeToken(String username, String series, String tokenValue, Date date) {
      this.username = username;
      this.series = series;
      this.tokenValue = tokenValue;
      this.date = date;
     }
    
     public String getUsername() {
      return this.username;
     }
    
     public String getSeries() {
      return this.series;
     }
    
     public String getTokenValue() {
      return this.tokenValue;
     }
    
     public Date getDate() {
      return this.date;
     }
    }
    영구 화 토 큰 프로젝트 를 사용 하려 면 PersistentTokenRepository 의 인 스 턴 스 를 입력 해 야 합 니 다.

    PersistentTokenRepository 인 터 페 이 스 는 주로 token 의 추가 삭제 와 관련 되 고 네 개의 인 터 페 이 스 를 수정 합 니 다.

    MyPersistentTokenRepository Impl 은 우리 로 하여 금 PersistentTokenRepository 인 터 페 이 스 를 실현 하 게 합 니 다:
    
    @Service
    public class MyPersistentTokenRepositoryImpl implements PersistentTokenRepository {
    
     @Autowired
     private JPAPersistentTokenRepository repository;
    
     @Override
     public void createNewToken(PersistentRememberMeToken persistentRememberMeToken) {
      MyPersistentToken myPersistentToken = new MyPersistentToken();
      myPersistentToken.setSeries(persistentRememberMeToken.getSeries());
      myPersistentToken.setUsername(persistentRememberMeToken.getUsername());
      myPersistentToken.setTokenValue(persistentRememberMeToken.getTokenValue());
      myPersistentToken.setUser_last(persistentRememberMeToken.getDate());
      repository.save(myPersistentToken);
     }
    
     @Override
     public void updateToken(String series, String tokenValue, Date lastUsed) {
      MyPersistentToken myPersistentToken = repository.findBySeries(series);
      myPersistentToken.setUser_last(lastUsed);
      myPersistentToken.setTokenValue(tokenValue);
      repository.save(myPersistentToken);
     }
    
     @Override
     public PersistentRememberMeToken getTokenForSeries(String series) {
      MyPersistentToken myPersistentToken = repository.findBySeries(series);
      PersistentRememberMeToken persistentRememberMeToken = new PersistentRememberMeToken(myPersistentToken.getUsername(), myPersistentToken.getSeries(), myPersistentToken.getTokenValue(), myPersistentToken.getUser_last());
      return persistentRememberMeToken;
     }
    
     @Override
     @Transactional
     public void removeUserTokens(String username) {
      repository.deleteByUsername(username);
     }
    }
    
    public interface JPAPersistentTokenRepository extends JpaRepository<MyPersistentToken,Long> {
     MyPersistentToken findBySeries(String series);
     void deleteByUsername(String username);
    }
    
    @Entity
    @Table(name = "persistent_token")
    public class MyPersistentToken {
     @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     private Long id;
     private String username;
     @Column(unique = true)
     private String series;
     private String tokenValue;
     private Date user_last;
    
     public Long getId() {
      return id;
     }
    
     public void setId(Long id) {
      this.id = id;
     }
    
     public String getUsername() {
      return username;
     }
    
     public void setUsername(String username) {
      this.username = username;
     }
    
     public String getSeries() {
      return series;
     }
    
     public void setSeries(String series) {
      this.series = series;
     }
    
     public String getTokenValue() {
      return tokenValue;
     }
    
     public void setTokenValue(String tokenValue) {
      this.tokenValue = tokenValue;
     }
    
     public Date getUser_last() {
      return user_last;
     }
    
     public void setUser_last(Date user_last) {
      this.user_last = user_last;
     }
    }
    자동 로그 인 인증 을 할 때 Spring Security 는 series 를 통 해 사용자 이름,token 및 지난번 자동 로그 인 시간 세 가지 정 보 를 얻 고 사용자 이름 을 통 해 이 토 큰 의 신분 을 확인 하 며 token 대비 로 이 토 큰 이 효과 가 있 는 지 알 수 있 습 니 다.지난번 자동 로그 인 시간 을 통 해 이 토 큰 이 만 료 되 었 는 지 알 수 있 고 전체 검사 가 통 과 된 후에 새로운 token 을 생 성 합 니 다.
    총결산
    Spring Security 학습 의 rememberMe 자동 로그 인 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Spring Security rememberMe 자동 로그 인 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기