본문 바로가기
Develop/Spring

Spring Security - 기본

by jaeyoungb 2022. 11. 19.

Spring Security

Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization) 기능을 지원하는 보안 프레임워크

 

 

Spring Security로 할 수 있는 보안 강화 기능

  • 사용자 인증 기능 적용
  • 권한 레벨 적용
  • 리소스에 대한 접근 제어
  • 데이터 암호화
  • SSL 적용
  • 웹 보안 공격 차단

 

Spring Security에서 사용하는 용어 정리

  • Principal(주체)
    - 인증이 성공적으로 수행된 사용자의 계정 정보
  • Authentication(인증)
    - 사용자가 본인이 맞음을 증명하는 절차
    - 사용자를 식별하기 위한 정보를 Credential(신원 증명 정보)라고 함 ex) 주민등록증
  • Authorization(인가)
    - 특정 리소스에 접근할 수 있도록 권한을 부여하는 것 (Role)
    - 반드시 Authentication 과정이 수행된 이후에 이루어져야 함
  • Access Control(접근 제어)
    - 리소스에 접근하는 행위를 제어하는 것

 

 

Spring Security의 자동 구성을 통해, 내부적으로 제공해주는 디폴트 로그인 페이지가 있다.

 

Spring Security에서 제공해주는 디폴트 로그인 정보는 다음과 같다.

  • Username : 'user'를 입력하면 됨
  • Password : 애플리케이션을 실행할 때마다 출력 로그에서 확인 가능

 

Spring Security를 적용하기 위해서는 'spring-boot-starter-security' 추가

 

Spring Security Configuration을 적용하면 원하는 인증 방식과 웹 페이지에 대한 접근 권한을 설정할 수 있다.

  • UserDetailsManager 인터페이스
    - UserDetails를 관리
  • UserDetails 인터페이스
    - 인증된 사용자의 핵심 정보를 포함
    - User 클래스를 이용해서 사용자의 인증 정보를 생성할 수 있음
  • withDefaultPasswordEncoder() 
    - 사용자의 패스워드를 암호화
    - Deprecated 상태로 권장되는 API는 아니지만, 테스트 환경이나 데모 환경에서만 사용함
  • username() 
    - 사용자의 username을 설정
  • password() 
    - 사용자의 password를 설정
  • roles() 
    - 사용자의 역할(Role)을 지정

 

HTTP 보안 설정 기본

  • HttpSecurity
    - HTTP 요청에 대한 보안 설정을 구성하기 위한 핵심 클래스

 

커스텀 로그인 페이지 지정

  • csrf().disable()
    - CSRF(Cross-Site Request Forgery) 공격에 대한 Spring Security에 대한 설정을 비활성화
    - 기본적으로 Spring Security는 아무 설정을 하지 않으면, CSRF 공격을 방지하기 위해서 클라이언트로부터 CSRF Token을 수신하고 검증
    - 로컬 환경에서 진행할 때는 CSRF 공격에 대한 설정이 필요하지 않으므로 사용 (하지 않으면, 403 에러 발생)
  • formLogin()
    - 폼 로그인 방식을 기본적인 인증 방법으로 지정
  • loginPage('요청 URL')
    - 미리 만들어둔 커스텀 페이지를 사용하도록 설정
  • loginProcessingUrl('요청 URL')
    - 로그인 인증 요청을 수행할 요청 URL을 지정
  • failureUrl('커스텀 페이지 URL')
    - 로그인에 실패할 경우, 어떤 화면으로 리다이렉트할 것인지 지정
  • and()
    - Spring Security 보안 설정을 메서드 체인 형태로 구성
  • authorizeHttpRequests()
    - 클라이언트의 요청이 들어오면, 접근 권한 확인
  • anyRequest().permitAll()
    - 클라이언트의 모든 요청에 대해 접근 허용

 

reqeust URI에 접근 권한 부여

antMatchers("/**").permitAll()이 제일 선두에 위치하게 되면, 이후 권한 설정에 상관없이 모든 request URL에 접근이 가능하게 된다.

따라서, 더 구체적인 URL 경로부터 접근 권한을 부여하고, 덜 구체적인 URL 경로에 접근 권한을 부여하는 습관이 필요하다.

 

 

  • Spring Security에서 지원하는 InMemory User는  애플리케이션 실행이 종료되면 InMember User 역시 메모리에서 사라진다. 테스트 환경이나 데모 환경에서 사용할 수 있는 방법이다.
  • Spring Security는 사용자의 크리덴셜(Credential)을 암호화 하기 위한 PasswordEncoder를 제공한다.
    https://docs.spring.io/spring-security/reference/features/authentication/password-storage.html#authentication-password-storage
  • PasswordEncoder는 다양한 암호화 방식을 제공하며, Spring Security에서 지원하는 PasswordEncoder의 디폴트 암호화 알고리즘은 bcrypt이다.
    - bcrypt  https://ko.wikipedia.org/wiki/Bcrypt
  • Spring Security에서 SimpleGrantedAuthority를 사용해 Role 베이스 형태의 권한을 지정할 때 ‘Roll_’ + 권한명 형태로 지정해 주어야 한다.
  • Spring Security에서는 Spring Security에서 관리하는 User 정보를 UserDetails로 관리한다.
  • UserDetailsService는 User 정보를 로드(load)하는 핵심 인터페이스이다.
  • UserDetails는 UserDetailsService에 의해 로드(load)되는 핵심 User 정보를 표현하는 인터페이스이다.
  • 일반적으로 Spring Security에서는 인증을 시도하는 주체를 User라고 부른다.
  • Principal은 User의 더 구체적인 정보를 의미하며, 일반적으로 Username을 의미한다.
  • Custom UserDetailsService를 사용해 로그인 인증을 처리하는 방식은 Spring Security가 내부적으로 인증을 대신 처리해주는 방식이다.
  • 패스워드 같은 민감한 정보는 반드시 암호화되어 저장되어야 한다.
  • 패스워드는 암호화된 상태에서 복호화할 이유가 없기 때문에, 단방향 암호화 방식으로 암호화되어야 한다.
    - 단방향 암호화에 대해 : https://en.citizendium.org/wiki/One-way_encryption

 

AutenticationProvider

  • Spring Security에서 클라이언트로부터 전달받은 인증 정보를 바탕으로 인증된 사용자인지에 대한 인증 처리를 수행하는 Spring Security 컴포넌트이다.
  • 인터페이스 형태로 정의되어 있으며, 다양한 유형의 AutenticationProvider 구현체를 제공한다.

 

DelegatingPasswordEncoder

Spring Security 5.0 이전부터 도입하여 더 유연한 구조로 PasswordEncoder를 사용할 수 있게 되었다.

 

장점

  • 암호화 알고리즘을 따로 지정해주지 않으면, Spring Security에서 권장하는 최신 암호화 알고리즘을 사용하여 패스워드를 암호화할 수 있도록 해준다.
  • 레거시 방식의 암호화 알고리즘으로 암호화된 패스워드의 검증을 지원한다.
  • 언제든 암호화 방식을 변경할 수 있다. (마이그레이션 작업 필요)

 

'Develop > Spring' 카테고리의 다른 글

Spring Security 인증 처리 흐름  (0) 2022.11.21
Spring Security 웹 요청 흐름  (0) 2022.11.19
인증/보안 기초  (1) 2022.11.17
Intellij에서 MySQL 연동 및 DB에 데이터 저장  (3) 2022.11.16
Spring Rest Docs - Asciidoc  (0) 2022.11.14