본문 바로가기

Server Programming/Spring Boot Full-Stack Programming

[스프링 풀스택 클론 코딩 - 회원가입] (1-19) 로그인 기억하기

반응형

세션정보는 기본적으로 30분으로, 30분이 지나면 로그인 정보는 사라진다.

server.servlet.session.timeout=30m

-> application.properties에서 설정으로 바꿔줄 수 있다.

 

 

세션이 종료되어도 로그인 유지가 가능하게 하려면 암호화해서 담아둬야한다.

-> rememberme.cookie 내 유저의 패스워드로 인증을 한다.

 

쿠키를 탈취당하지 않도록 해야한다.

-> 쿠키를 탈취당하면 해킹당한 것과 같다.

 

로그아웃을 한다면 쿠키와 세션을 날리도록 설정

-> 해쉬기반의 쿠키를 사용하는 것이 아닌, 쿠키안에 랜덤한 문자열을 만들어 같이 저장하고 매번 인증할 때 바뀌도록

 

하지만, 이경우에도 탈취당했을 경우 해커만 탈취한 쿠키로 인증할 수 있는 문제 발생

-> Username, 토큰(랜덤, 매번 변경), 시리즈 (랜덤, 고정)

-> 모든 토큰을 삭제해 탈취한 쿠키를 사용하지 못하게 방지하는 방법을 사용한다.

 

  • 쿠키만 인증 수단으로 사용
  • 쿠키 + 토큰을 인증 수단으로 사용
  • 쿠키 + 토큰 + 시리즈를 인증 수단으로 사용
    • 쿠키가 탈취당했을 경우,
      유효하지 않는 토큰 + 유효한 시리즈로 접속하게 되고, 이런 경우 탈취한 쿠키를 사용하지 못하도록 방지

 

 

 

 


 

login

<!--로그인 유지를 위한 처리 -->
   <div class="form-group form-check">
    <input type="checkbox" class="form-check-input" id="rememberMe" name="remember-me" checked>
    <label class="form-check-label" for="rememberMe" aria-describedby="rememberMeHelp">로그인 유지</label>
</div>

 

PersistentLogins

package com.demo.domain;

import java.time.LocalDateTime;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Getter;
import lombok.Setter;

//테이블명 -> 엔터티 -> getter, setter 자동생성 어노테이션
@Table(name = "persistent_logins")
@Entity
@Getter @Setter
public class PersistentLogins {
//맵핑이 되는 엔터티 클래스 작성
    @Id
    @Column(length = 64)
    private String series;

    @Column(nullable = false, length = 64)
    private String username;

    @Column(nullable = false, length = 64)
    private String token;

    @Column(name = "last_used", nullable = false, length = 64)
    private LocalDateTime lastUsed;

}

 

SecurityConfig

	//회원가입을 위한 시큐리티 수동 설정
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
    	// 로그인 기억 처리를 위한 의존성 주입
	private final AccountService accountService;
	// jdbc는 데이터소스를 필요로 하기 떄문에 의존성 주입 -> JPA를 사용하기 떄문에, bean으로 등록이되어있다.
	private final DataSource dataSource;

    
    private PersistentTokenRepository tokenRepository() {
		// TODO Auto-generated method stub
		JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
		jdbcTokenRepository.setDataSource(dataSource);
		// 토큰 리파지토리에 데이터 소스 주입 -> 리파지토리가 사용하는 테이블 작성 -> 해당 스키마에 필요한 엔터티를 Account에 추가
		return jdbcTokenRepository;
	}
반응형