본문 바로가기
공부/Spring Security

Spring Security 기본 구성

by xladmt 2024. 12. 29.
- 전반적인 스프링 시큐리티의 아키텍처에 대해 알아보고 커스텀하게 사용해보자!
- 인증 프로세스를 구현하기 위해 스프링 시큐리티는 여러 컴포넌트로 구성되어 있음
(인증 필터, 인증 관리자, 인증 공급자, 암호 인코더, 사용자 세부 정보 서비스, 보안 컨텍스트)

 

스프링 시큐리티 아키텍쳐

(1) 큰 관점에서는 클라이언트는 요청을 서버로 전달함

(2) 인증필터가 요청을 가로챔(intercept)

  • 인증 필터는 인증 요청을 가로채 인증 관리자에게 위임

(3) 인증 관리자는 인증 논리를 구현하는 인증 공급자를 이용하여 인증을 처리

(4) 인증 공급자는 사용자 관리 책임을 구현하는 사용자 세부 정보 서비스를 인증 논리에 이용함 ( 사용자 검증 )

  • 인증 공급자는 암호 관리를 구현하는 암호 인코더를 인증 논리에 이용 (비밀번호 검증)

(5) 사용자 세부 정보 서비스는 사용자를 찾을 수 있도록 하며 암호 인코더는 암호를 검증함

  • UserDetailService에서 사용자를 조회하고, 찾을 수 있는지 없는지를 찾아봄.
  • PasswordEncoder에서 입력된 암호값을 설정된 암호화 방식에 따라 검증을 하게 됨.
  • 그 인증 결과값이 인증 공급자에게 반환됨

 

(6) 인증 공급자가 받은 인증 결과값을 인증 관리자 -> 인증 필터에게 전달하여 보안 컨텍스트에게 전달

  • 인증된 엔티티에 대한 세부 정보가 보안 컨텍스트에 저장되며 인증 데이터를 유지함

=> 클라이언트가 한 번 요청을 해서 인증된 정보가 나오면 그 정보는 보안 컨테스트에 저장되는 것이고, 매번 이 프로세스를 진행하지 않고 먼저 보안 컨텍스트에서 찾는다.

 

UserDetailsService

  • UserDetailService는 인터페이스
  • UserDetailService를 구현하는 구현체가 사용자에 대한 정보를 관리함
  • 스프링 시큐리티에서 제공하는 기본 구현체는 내부 메모리(InMemory)에 기본 자격 증명을 등록함
  • 기본 자격 증명의 사용자 이름으로 user를 사용함
  • user는 스프링 컨텍스트가 로드될 때, 자동으로 생성됨
  • 내부 메모리에서 자격 증명을 관리하는 것은 절대로 운영 환경에서는 사용되지 않아야 하는 방법이며 단순히 UserDetailsService가 어떻게 동작하는지를 보여주기 위한 개념적인 구현체임

 

1. InMemoryUserDetailsManager 구현체가 존재함

2. 입력한 유저 정보가 User 객체로 반한됨

 => User는 Spring Security에서 관리하는 사용자 객체임.

 

PasswordEncoder

  • PasswordEncoder는 크게 두 가지 역할을 수행함
    • 암호를 인코딩
    • 암호가 기존 인코딩과 일치하는지 확인

  • 가장 단순한 구현에서는 암호를 일반 텍스트로 관리하고 인코딩하지 않음( -> NoOpPasswordEncoder )
    • 다양한 구현이 존재함
  • UserDetailsService의 구현을 변경하면 PasswordEncoder 역시 지정해야 함

- NoOpPasswordEncoder : 평문으로 관리하는 인코더

 

ex) PasswordEncoder 종류 예시 - BCrypterPasswordEncoder

  • 요청 헤더에 Basic dX... 형식으로 Base64 인코딩이 되어 인입됨
  • decode 메소드를 통해 user1:53ee.. 로 디코딩
  • 디코딩 결과를 바탕으로 AuthenticationToken 생성

 

HTTP Basic 인증의 자격 증명

1) 사용자의 이름과 비밀번호를 Base64 인코딩을 하고

2) "Basic" 이라는 prefix와 함께 하나의 문자열로

3) HTTP Authorization  헤더에 담아 서버로 전달함

*HTTP Basic 인증은 자격 증명의 기밀성을 절대로 보장하지 않음

- Base64라는 인코딩 방법은 암호화나 해싱 방법이 아니기 때문에 전송 중에 자격 증명이 탈취당하면 누구든지 해석이 가능함

- 최소한의 기밀을 위해 HTTPS를 함께 이용하는 것이 아니라면 일반적으로 HTTP Basic 인증은 운영 환경에서 이용하지 않음

 

HTTP와 HTTPS 비교

HTTPS를 구헝하는 방법은 여러 패턴이 존재하며 애플리케이션 수준에서 적용할 수도 있고 인프라 수준에서 HTTPS를 구성할 수도 있음. 스프링 시큐리티를 활용해서도 HTTPS를 활성화 시킬 수 있음

HTTPS를 활성화하기 위해서는 인증기관(CA, Certification Authority)이 서명한 인증서가 필요함

- 인증서를 이용한다는 것은 클라이언트가 받는 응답이 인증 서버에서 보낸 것이라는 점을 알 수 있음

- 인증서는 보통 구매해야 하며, 테스트 용으로 사용하려면 OpenSSL과 같은 툴을 이용할 수 있음

 

OpenSSL을 활용하여 자체 서명 인증서 구성

'공부 > Spring Security' 카테고리의 다른 글

HTTP Basic 인증 방식  (0) 2025.01.01
PasswordEncoder 와 암호처리  (0) 2024.12.31
UserDetails  (0) 2024.12.31
Spring Security 시작  (0) 2024.12.29