일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 파이썬
- Spring
- spotify
- C++
- SECS/GEM
- SECS-II
- 스포티파이
- java
- Baekjoon
- programmers
- modern c++
- Spring JPA
- 회귀
- python
- 비트겟
- SW Expert Academy
- Computer Science
- 프로그래머스
- MYSQL
- 회원가입
- 자바
- CS
- 백준
- regression
- c
- Spotify Api
- spring boot
- Gem
- SWEA
- SECS
Archives
- Today
- Total
비버놀로지
[Spring JPA] 1-13. 회원 가입 : 로그인 기억하기 본문
728x90
Username, 토큰(랜덤, 매번 바뀜), 시리즈(랜덤, 고정)
쿠키를 탈취 당한 경우, 희생자는 유효하지 않은 토큰과 유효한 시리즈와 Username으로 접속하게 된다.
이 경우, 모든 토큰을 삭제하여 해커가 더이상 탈취한 쿠키를 사용하지 못하도록 방지할 수 있다.
package com.studyolle.config;
import com.studyolle.account.AccountService;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import javax.sql.DataSource;
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final AccountService accountService;
private final DataSource dataSource;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.mvcMatchers("/", "/login", "/sign-up", "/check-email-token",
"/email-login", "/check-email-login", "/login-link").permitAll()
.mvcMatchers(HttpMethod.GET, "/profile/*").permitAll()
.anyRequest().authenticated();
http.formLogin()
.loginPage("/login").permitAll();
http.logout()
.logoutSuccessUrl("/");
http.rememberMe()
.userDetailsService(accountService)
.tokenRepository(tokenRepository());
}
@Bean
public PersistentTokenRepository tokenRepository() {
JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
jdbcTokenRepository.setDataSource(dataSource);
return jdbcTokenRepository;
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.mvcMatchers("/node_modules/**")
.requestMatchers(PathRequest.toStaticResources().atCommonLocations());
}
}
먼저, 현재의 security 코드입니다.
security에서 제공하는 rememberMe()라는 것을 활용해서 랜덤한 토큰과 username을 활용해서 쿠키를 만들어주는 작업을 해줍니다.
그리고 Persistent를 사용하기 위한 PersistentLogins를 만들어 줍니다.
package com.studyolle.domain;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDateTime;
@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;
}
위와 같은 PersistentLogins를 만들어 주면 username, token, series를 활용해 사용할 수 있습니다.
그렇게 실행을 해서 로그인을 해주면
위와같이 토큰이 생긴것을 확인할 수 있습니다.
728x90
'LANGUAGE STUDY > Spring' 카테고리의 다른 글
[Spring JPA] 1-12. 회원 가입 : 로그인 로그아웃 (0) | 2021.05.04 |
---|---|
[Spring JPA] 1-11. 회원 가입 : 현재 인증된 사용자 정보 참조 (0) | 2021.05.04 |
[Spring JPA] 1-10. 회원 가입 : 인증 메일 확인 테스트 (0) | 2021.05.01 |
[Spring JPA] 1-9. 회원 가입 : 인증 메일 확인 (0) | 2021.05.01 |
[Spring JPA] 1-8. 회원 가입 : 패스워드 인코더 (0) | 2021.04.30 |
Comments