본문 바로가기
Framework/Spring

Core Spring Security | 인증 API | 02강 사용자 정의 보안 기능 구현

by YIAN 2021. 10. 29.

Core Spring Security

핵심 개념 및 아키텍처 이해와 실전 예제로 완성하는 스프링 시큐리티 프로그래밍

 

1장 Spring Security 기본 API & Filter 이해

02강 인증 API - 사용자 정의 보안 기능 구현

 


👈 이전 글 | 📚 목차 | 다음 글 👉

 


 

이전 글처럼 의존성을 추가하면 Spring Security에서 웹 보안이 활성화되고 보안 기능이 시스템에 반영되어 작동됩니다. 그러나 이전 글에서 만들었던 현재의 보안 시스템은 최소한의 기능만 가진 상태입니다. 보안 기능을 보완하고 구현하기 위해 알아야 할 내용이 있습니다. 이번 글에서는 설정 클래스를 만들어서 해당 내용을 확인하려고 합니다.

 

 

1. 핵심 클래스 WebSecurityConfigurerAdapter, HttpSecurity

 

위의 코드를 살펴보시면 WebSecurityConfigurerAdapter 클래스가 11개 정도의 API를 호출하고 있는데, HttpSecurity 클래스와 ExceptionTranslationFilter도 같이 생성하게 됩니다. 각 설정 클래스가 각각의 필터를 생성합니다. 의존성을 추가했을 때 핵심 클래스는 WebSecurityConfigurerAdapter와 HttpSecurity 입니다. 이 2개의 클래스를 중점적으로 알아보겠습니다.

 

  • WebSecurityConfigurerAdapter 클래스
    • Spring Security의 웹 보안 기능 초기화 및 설정하는 클래스
    • 웹 보안 기능을 활성화하고 보안 기능이 실행되게 함
    • 해당 클래스는 HttpSecurity를 생성함
  • HttpSecurity 클래스
    • 세부적인 보안 기능을 설정할 수 있는 API 제공
    • 인증 API와 인가 API를 제공
인증 API 인가 API
http.formLogin()
http.logout()
http.csrf()
http.httpBasic()
http.SessionManagement()
http.RememberMe()
http.ExceptionHandling()
http.addFilter()
http.authorizeRequests()
http.antMatchers(/admin)
http.hasRole(USER)
http.permitAll()
http.authenticated()
http.fullyAuthentication()
http.acess(hasRole(USER))
http.denyAll()

 

위처럼 HttpSecurity에는 인증 API와 인가 API가 있습니다. 앞으로 포스팅될 글에서는 각각의 API가 어떤 역할을 하고, 어떤 과정을 통해 인증 인가 처리를 할 수 있는지 알아볼 것입니다. 핵심 클래스인 WebSecurityConfigurerAdapter와 HttpSecurity는 보안 기능이 작동하도록 하는 역할을 합니다. 본 포스팅에서는 최소한의 웹 보안 기능에서 보안에 안전하고 강력한 시스템으로 구축할 수 있도록 구현하려고 합니다.

 

 

2. SecurityConfig 설정

 

예시 코드

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    	http
            .authorizeRequests()
            .anyRequest().authenticated()
        .and
            .formLogin();
}

 

하단의 내용에서는 SecurityConfig 라는 사용자 정의 보안 설정 클래스를 만들 것입니다. SecurityConfig 클래스를 생성하여 WebSecurityConfigurerAdapter를 상속받습니다. 상속받은 클래스 중에 HttpSecurity 클래스를 파라미터로 전달받는 메소드를 오버라이드 합니다. 인증과 인가와 관련된 API를 사용할 수 있도록 보안 기능을 구현하려고 합니다.

 

 

3. 사용자 정의 보안 설정 클래스 SecurityConfig 생성

 

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().authenticated()
        ;
        
        http
                .formLogin()
        ;
    }
}

 

SecurityConfig라는 클래스를 임의로 생성하여 위의 코드를 작성합니다. WebSecurityConfigurerAdapter 클래스를 상속받고, @Configuration과 @EnableWebSecurity 어노테이션을 선언해줍니다. @EnableWebSecurity는 여러 클래스를 import해서 실행시켜주는 기능을 하며, 웹 보안 기능이 활성화됩니다. 인증 API와 인가 API를 추가할 수 있는 메소드들을 오버라이드합니다. 

 

 

인가 정책

        http
                .authorizeRequests()
                .anyRequest().authenticated()
        ;
  • .authorizeRequests(): 요청에 대한 보안 검사를 함
  • .anyRequest().authenticated(): 어떤 요청에도 인증을 받도록 설정

 

인증 정책

        http
                .formLogin()
        ;
  • .formLogin(): formLogin 형식으로 인증하도록 설정

 

인가 정책은 Spring Security가 초기화되면서 설정되는 어떠한 요청에도 인증을 받도록 설정합니다. 인증 정책은 formLogin 방식으로 API를 설정합니다. 그러면 서버를 기동 시켜 보겠습니다.

 

 

4. application.properties 설정

 

콘솔 창에 password가 있는데 계속 이런 상태로 값을 사용하기 어려우니 환경설정 파일인 application.properties로 선언해주겠습니다. 우리가 지정한 계정으로 인증할 수 있도록 설정해줍니다.

 

spring.security.user.name=user
spring.security.user.password=1111

 

application.properties에 위와 같이 입력합니다.

 

다시 서버를 기동해서 보안 인증 기능을 확인합니다. 확인되었다면 https://localhost:8080로 접속해주세요.

 

 

5. 로그인 후 기능 확인

 

인증을 받지 않으면 루트 페이지로 접근이 되지 않는 상태입니다. 환경설정 파일(application.properties)에 작성했던 아이디와 비밀번호 값을 넣어줍니다.

 

로그인하면 문자열이 출력됨을 확인할 수 있습니다. 정상적으로 보안 기능이 작동하고 있다는 것이 확인됩니다.

 

다음 포스팅에서는 설정 클래스의 configure 메소드 안에서 인증 방식과 인가 처리를 위한 API를 작성하고 테스트하는 내용을 다루겠습니다.

 

 


👈 이전 글 | 📚 목차 | 다음 글 👉

 


 

✍ 회고

 

강의에서 설명하는 WebSecurityConfigurerAdapter, HttpSecurity, ExceptionTranslationFilter에 대한 설명 부분은 건너뛰었습니다. Spring Security에 람다를 도입했다는 소식을 들었는데, 다음과 같이 사용해도 되나 봅니다.

 

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
        http.formLogin();
    }
}

 

그렇지만 저는 강의에 나온 방식이 좀 더 가독성이 좋지 않나 생각이 드네요.

 

이번 글을 통해 인증 정책과 인가 정책 부분을 작성하는 방법에 대해 개념을 정립했습니다. 인증과 인가에 대한 개념이 헷갈려서 찾아보았는데, 간단하게 다음과 같이 설명됩니다. 영어 단어 뜻으로는 똑같지 않나 싶은데 Spring Security에서 사용하는 개념은 다릅니다. 참고용으로 읽어주시면 감사하겠습니다.

 

  • 인증(Authentication): 사용자를 확인하는 과정 (예시: 로그인)
  • 인가(Authorize): 특정 자원에 사용자가 접근할 수 있는 권한 (예시: USER, ADMIN)

 

 

🍱 참고사항

  • 해당 강의는 인프런에서 정수원 님의 "스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security"를 통해 보실 수 있습니다.
  • 해당 포스팅을 진행하면서 생성된 코드들은 GitHub 저장소에 올리고 있습니다. 도움이 되실지 모르겠지만 하단의 GitHub Repository 주소를 참고해 주세요.
  • Code in GitHub: https://github.com/Yian-Kim/learning-Spring-Security
 

GitHub - Yian-Kim/learning-Spring-Security: 🔥 Wanna be Java Spring Security Master

🔥 Wanna be Java Spring Security Master. Contribute to Yian-Kim/learning-Spring-Security development by creating an account on GitHub.

github.com

 

댓글