본문 바로가기

Spring

[Spring]Spring Security

스프링 시큐리티란 스프링 기반의 Application 인증과 권한, 인가 등을 담당하는 스프링의 하위 프레임 워크이다.

 

인증? : 신원을 확인하는 것 (누구인지? / 로그인 아이디, 비밀번호가 유효한지?)

인가? : 권한이 있는지 확인하는 것(어떤 것을 할 수 있는지? / 너가 뭘 할 수 있어?)

 

주로 Servlet Filter와 Filter Chain으로 구성된 위임모델을 사용하며, 개발자는 일일이 보안관련 로직을 만들지 않아 편해진다.

 

특징

  • 보안과 관련된 많은 옵션을 제공받아 편리하게 사용 가능
  • Filter 기반으로 동작해 MVC와 분리하여 관리 및 동작 가능
  • 어노테이션 사용으로 간단하게 설정 가능
  • 세션 & 쿠키 방식으로 인증
  • 인증 관리자와 접근 결정 관리자를 통해 사용자의 리소스 접근 관리

 

Filter 종류

 

이제 우리가 만든 page에서 Spring Security를 적용해보자.

 

1. build.gradle파일에 dependency 추가

implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'

추가 후 로컬서버도 재시작 한다.

 

2. 다시 페이지로 이동해보기

Spring Security를 적용한 후 페이지를 이동해보면 달라진 점을 발견할 수 있을 것이다.

바로 로그인을 해야 들어갈 수 있도록 만들어진 것이다.

이에 로그인을 하려면 어떻게 해야 할까?

Username : user

Password : 실행했을 때 콘솔창에 나오는 password가 있을것이다. 그것을 입력해주면 된다.

Using generated security password: ㅇㅇㅇㅇㅇ-ㅇㅇㅇㅇ-ㅇㅇㅇㅇ-ㅇㅇㅇㅇ-ㅇㅇㅇㅇㅇㅇ

그러면 바로 출력된다.

 

3. 전체 페이지 로그인 없이 조회

우리가 만든 게시물은 굳이 로그인이 필요 없이 출력시켜도 상관 없다.

그런데, 우리는 스프링 시큐리티를 적용했기 때문에 로그인이 필요하다. 어떻게 하면 로그인 없이 출력시킬 수 있을까?

 

우리는 Security에 대한 설정을 할 수 있는 class를 만들어야 한다.

SecurityConfig class를 만들어 아래 코드를 넣자.

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/**").permitAll()
                ;
        return http.build();
    }
}

여기서 다양한 어노테이션들이 있다.

  • @Configuration : 스프링의 환경설정 파일임을 알림
  • @EnableWebSecurity : 모든 요청하는 URL이 스프링의 시큐리티 제어를 받음
    → 사용하면 내부적으로 SpringSecurityFilterChain 이 동작해 URL필터가 적용된다.

세부설정은 SecurityFilterChain의 객체 Bean을 생성하여 설정할 수 있는데, 안에 있는 코드는 인증되지 않아도(로그인 되지 않아도) 화면을 출력시킨다는 의미이다.