[Spring Security]토이프로젝트를 위한 공부(2) - 스프링 시큐리티 공부하기

gamja·2022년 11월 3일
0

유튜브 <코딩의 신> - Spring Boot으로 웹 출시까지 강의를 보면서 Spring Security 공부하기!

Spring Security 직접 사용해보고 싶었는데 딱마침 내가 듣고 있던 유튜브 강의에서 Spring Security를 다루는 영상이 있어서 열심히 공부하고자 포스팅 올립니다 👨🏻‍💻

1. gradle 설정

아래 두 줄 추가해주기
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-test'

2. Configuration 생성

2-1. Spring Security 사용을 위한 설정 파일인 Configuration 생성


@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();
    }
}

권한 처리를 할 수 있도록 권한처리 데이터베이스를 하나 만들어줘야 한다.

2-2. role 테이블 생성

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 관계를 사용할 예정

2-3. user_role 테이블 생성

user테이블 - role테이블을 연결하기 위한 user_role 테이블을 생성해준다.

  • user_id와 role_id를 primary key 로 설정을 해주고 user_id는 user테이블의 id와 fk 연결, role_id는 role테이블의 id와 fk 연결을 해준다.

join을 하면 성능이 떨어질 수밖에 없다.
nosql db를 사용하면 중복되는 데이터가 들어가더라도 성능을 위해서 일부러 join을 사용하지 않는 경우가 있다.

Spring Security 용어구분

  • Authentication : 로그인 관련 처리
  • Authroization : 권한에 대한 처리

3. 로그인 페이지 생성

로그인 한 사람들만 접속 화면이 떠야 하기 때문에 로그인 페이지를 생성해줘야 한다.

3-1. 부트스트랩에서 signin Template의 main 부분만 복붙

직접 프론트도 구현해도 되지만 백엔드 영역에 좀더 집중하기 위해서 부트스트랩 사용!

3-2. css 적용하기

signin.css가 필요하기 때문에 파일을 생성하고 th:href="@{/css/signin.css}" 을 head에 넣어준다.

4. User 테이블 - Role 테이블 매핑하기

현재 user_role 테이블을 통해서 user table과 role table이 연결되어 있는 상태이다.
객체끼리도 매핑을 해줘야 하기 때문에 @ManyToMany 어노테이션을 통해서 매핑을 해줄 것이다.

Join 테이블

데이터베이스 테이블의 연관관계를 설계 하는 방법은 크게 두 가지이다.

  • 외래키를 가지고 연관관계를 설계하는 조인 컬럼 방법
  • 테이블과 테이블 사이에 별도의 조인 테이블을 만들어 양 테이블간의 연관관계를 설정하는 방법

📌 내가 사용할 조인 방법은 두 번째 방법이다.

@JoinTable 속성

  • name : 조인 테이블 명
  • joinCoumns : 현재 엔티티를 참조하는 외래키
  • inverseJoinColumns : 반대 방향 엔티티를 참조하는 외래키


role 테이블과 매핑을 위해서 @MnayToMany를 사용해줬다.


mappedBy : User 테이블에 있는 매핑한 객체의 변수명이다. 동일하게 해줘야 한다.

profile
눈도 1mm씩 쌓인다.

0개의 댓글

관련 채용 정보