유튜브 <코딩의 신> - Spring Boot으로 웹 출시까지 강의를 보면서 Spring Security 공부하기!
Spring Security 직접 사용해보고 싶었는데 딱마침 내가 듣고 있던 유튜브 강의에서 Spring Security를 다루는 영상이 있어서 열심히 공부하고자 포스팅 올립니다 👨🏻💻
아래 두 줄 추가해주기
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-test'
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Autowired
private DataSource dataSource; // application.properties에 기재된 데이터 정보를 사용할 수 있도록 Autowired 한다.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.antMatchers("/", "/home").permitAll() // 해당
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/login")
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
// jdbcauthentication 방법 (db로 인증하는 방법)
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) // autowired를 통해서 autenticationManagerBuilder를 생성한다.
throws Exception { // AuthenticationManagerBuilder 인스턴스를 가지고 스프링 내부에서 인증 처리를 한다.
auth.jdbcAuthentication()
.dataSource(dataSource) // datasource에 있는 정보를 사용해서 인증 처리를 한다.
.passwordEncoder(passwordEncoder()) // 아래 있는 PasswordEncoder를 여기에 넣어주고, 비밀번호 암호화를 자동으로 해준다.
.usersByUsernameQuery("select username,password,enabled " // 인증 처리
+ "from user "
+ "where username = ?")
.authoritiesByUsernameQuery("select email,authority " // 권한 처리
+ "from authorities "
+ "where email = ?");
}
// 안전하게 암호화할 수 있도록 하는 설정
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
권한 처리를 할 수 있도록 권한처리 데이터베이스를 하나 만들어줘야 한다.
user테이블과 role테이블을 연결하기 위해서는 테이블 매핑이 필요하다.
테이블이 서로 관계를 맺는 방식은 여러 가지가 있다.
@OneToOne
user - user_detail 처럼 user테이블의 상세한 데이터를 따로 빼놓은 user_detail테이블과 user테이블은 @OneToOne 관계
@OneToMany
user - board 처럼 한 명의 사용자가 여러 개의 게시글을 작성할 수 있을 때 즉, '일대다'의 관계를 맺을 때 @OneToMany 관계를 맺음
@ManyToOne
board - user 처럼 여러 게시글은 한 명의 사용자에 의해 만들어진다. '1번 3번 5번 게시글을 모두 감자 회원이 작성하였다.'
@ManyToMany
user - role 하나의 사용자는 여러개의 권한을 가질 수 있고, 하나의 권한 또한 여러 개의 사용자를 가질 수 있다. 'a는 읽기,쓰기,수정 권한을 갖을 수 있다. 읽기 권한은 a, b, c가 가지고 있다.'
권한 테이블에서는 @ManyToMany 관계를 사용할 예정
user테이블 - role테이블을 연결하기 위한 user_role 테이블을 생성해준다.
join을 하면 성능이 떨어질 수밖에 없다.
nosql db를 사용하면 중복되는 데이터가 들어가더라도 성능을 위해서 일부러 join을 사용하지 않는 경우가 있다.
Spring Security 용어구분
- Authentication : 로그인 관련 처리
- Authroization : 권한에 대한 처리
로그인 한 사람들만 접속 화면이 떠야 하기 때문에 로그인 페이지를 생성해줘야 한다.
직접 프론트도 구현해도 되지만 백엔드 영역에 좀더 집중하기 위해서 부트스트랩 사용!
signin.css가 필요하기 때문에 파일을 생성하고 th:href="@{/css/signin.css}"
을 head에 넣어준다.
현재 user_role 테이블을 통해서 user table과 role table이 연결되어 있는 상태이다.
객체끼리도 매핑을 해줘야 하기 때문에 @ManyToMany 어노테이션을 통해서 매핑을 해줄 것이다.
Join 테이블
데이터베이스 테이블의 연관관계를 설계 하는 방법은 크게 두 가지이다.
- 외래키를 가지고 연관관계를 설계하는 조인 컬럼 방법
- 테이블과 테이블 사이에 별도의 조인 테이블을 만들어 양 테이블간의 연관관계를 설정하는 방법
📌 내가 사용할 조인 방법은 두 번째 방법이다.
@JoinTable 속성
role 테이블과 매핑을 위해서 @MnayToMany를 사용해줬다.
mappedBy : User 테이블에 있는 매핑한 객체의 변수명이다. 동일하게 해줘야 한다.