[Clone Coding] 인스타그램 - Security & Repository(4)

Cho Doil·2023년 1월 27일

clone-coding

목록 보기
4/7

Security 코드 이해

Spring Security 덕분에 따로 설정을 하지 않으면 로컬 서버에 띄운 웹도 접속하기 힘들다는 것을 알게 되었다. 그래서 SecurityConfig를 설정했다.
몇몇 코드는 처음 보는 것들이었다.
HttpSecurity를 인자로 받아서 여러 보안 설정을 해줘야 했는데 내가 참고한 코드는 WebSecurityConfigurerAdapter를 상속 받았다. 하지만 내가 사용하는 스프링 부트의 버전에서는 이는 사용하지 말라고 했기에 검색해서 다른 방법으로 설정했다. 이 방법은 스프링 Bean에 추가하라는 것이었다. 그래서 권장하는 방법대로 SecurityFilterChain으로 리턴 시키는 메소드를 만들어 Bean에 넣어줬다.

public class SecurityConfig {

//    @Override
//    protected void configure(HttpSecurity http) throws Exception {
//        http.csrf().disable();
//        http.authorizeRequests()
//                .antMatchers("/", "/login", "/singup", "/style/**", "/js/**", "/img/**").permitAll()
//                .anyRequest().authenticated();
//    }

    @Bean
    protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("/", "/login", "/signup", "/style/**", "/js/**", "/img/**").permitAll()
                .anyRequest().authenticated();
        return http.build();
    }
}

위의 코드를 보면 원래는 configure를 오버라이드해서 보안을 설정해줬는데 대신에 같은 방법으로 설정하고 Bean에 넣는 방식으로 처리했다.

위의 코드를 잘 몰랐기에 간단하게 정리하겠다.

  • csrf(): Cross site request forgery로 사이즈간 위조 요청이다. 즉, 정상적인 사용자가 의도치 않는 위조 요청을 보내는 것을 의미한다.
  • disable(): csrf를 사용하지 않게 한다. rest api를 이용하는 서버는 다른 인증 정보를 포함시키고 따로 서버에 인증 정보를 저장하지 않기 때문에 csrf는 불필요하다는 것이다. 아마 이 프로젝트는 OAuth2를 사용하기 때문에 그런 것 같다.
  • authorizeRequest(): 요청을 승인한다는 뜻인데 찾아보니 특정 리소스의 접근 허용 또는 특정 권한을 가진 사용자만 접근을 가능하게 설정해준다.
  • antMatchers(): 이건 특정 리소스에 대한 권한을 설정하는 것이다.
  • permitAll(): antMatchers에 설정한 리소스의 접근을 인증절차 없이 허용한다는 의미이다.
  • anyRequest(): 모든 리소스를 의미하며 접근 허용 리소스 및 인증 후 특정 레벨의 권한을 가진 사용자만 접근 가능한 리소스를 설정하고 그외 나머지 리소스들은 무조건 인증을 완료해야 접근이 가능하다는 의미이다.

이 외에 많은 코드들이 있지만 그것은 나중에 정리하면서 공부해야겠다.

Repository 구현

원래는 각각의 Repository를 직접 구현할 생각이었고 그렇게도 했었지만 JPA Repository를 상속받으면 인터페이스로만 구현해도 자동으로 구현체까지 만들어 여러 메소드를 처리해준다는 것이다. 그래서 바로 코드를 변경했다.

public interface UserRepository extends JpaRepository<User, Long> {
}

이러면 구현 끝이다. save, findAll 등 어렵진 않지만 직접 구현하기엔 좀 귀찮은 것들을 한 번에 처리해준다. 추가적인 메소드만 구현하면 된다.
Spring과 JPA는 정말 편리한 기능을 제공해준다!

마지막으로

전체적인 구조를 이해하고 내가 모르는 부분은 찾아보면서 공부할 생각으로 시작했다. 공부 방법을 개발 순서가 이렇지 않을까? 하며 커밋을 어느정도 따라가며 공부하고 이해하며 클론 코딩을 진행했다.
하지만.. 생각보다 오래 걸린다. 본인이 아직 Spring에 대해 잘 모르는 것도 있지만 야생형으로 공부하는데 너무 착실하게 하는 것 같아 시간이 오래 걸리는 것 같다. 첫 클론 코딩인데 직접 개발하는 것 처럼 처음부터 참견하며 테스트까지 만들면서 하는 것은 아무래도 무리이다.
지금 당장에도 직접 개발하고 싶은 것들이 있는데 시간을 너무 오래 쓰기 싫으니 다음부턴 차례대로 코드를 보며 모르는 부분을 정리하고 왜 필요한지 왜 쓰이는지 이해하고 바로 코드를 작성해야겠다.
코드를 따라하되 이해하고 넘기자! 그렇게 클론 코딩을 빠르게 끝낸 후 리팩토링이나 기능 추가를 해보자. 코드를 보완할 필요가 있을지는 모르지만 시도를 해보는 것도 좋을 것 같다. :D

profile
초보 개발자의 저장소

0개의 댓글