[Spring in Action] Spring Security & LDAP & CSRF

728x90
반응형
SMALL

Spring in Action (5판)

  • 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발
  • Walls, Craig 지음
  • 제어펍 출판사
  • 2020.05.14

 

스프링 인 액션 개인 스터디 내용을 정리하자.

 

 

 

 


Spring Security

출처 : https://ict-nroo.tistory.com

스프링 기반의 애플리케이션 보안, 인증, 권한을 담당하는 프레임워크이다.

 

Filter 기반으로 동작하기 때문에 Spring MVC와 분리되어 관리, 동작한다.

 

  • 접근 주체 (Principal) : 보호된 대상에 접근하는 유저
  • 인증 (Authenticate) : 현재 유저가 누구인지 확인, 애플리케이션 작업을 수행할 수 있는 주체임을 증명
  • 인가 (Authorize) : 현재 유저가 어떤 서비스, 페이지에 접근할 수 있는 권한이 있는지 검사
  • 권한 (Authirization) : 인증된 주체가 애플리케이션 동작을 수행할 수 있도록 허락되는지 결정

Spring Security 구조

스프링 시큐리티는 세션 - 쿠키 방식으로 인증한다.

  • 유저가 로그인 시도 (HTTP Request)
  • AuthenticationManager는 인증과 관련된 실제적 처리를 담당
  • AuthenticationManager는 UserDetailsService에 선언된 정보를 바탕으로 User DB에 접근
  • DB에 있는 유저라면 UserDetail로 꺼내서 유저의 세션을 생성
  • 스프링 시큐리티의 인메모리 세션저장소인 SecurityContextHolder에 저장
  • 유저에게 세션 ID와 함께 응답 전달
  • 이후 요청 시, 요청 쿠키에서 JSESSIONID를 까서 검증 후 유효하면 인증

개발자는 UserDetailsService 인터페이스를 구현하고 인증 매니저에 연결하는 작업만 진행하면 된다.

 

Spring Security 사용

 

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
     
    @Override
    protected void configure(HttpSecurity htto) throws Exception {
        // HTTP 보안 구성
    }
 
    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 사용자 인증 정보 구성
        // 인증을 하기 위해 사용자를 찾는 방법을 지정하는 코드 (사용자 스토어 구성)
    }
}

 

스프링 5부터는 비밀번호 암호화 필수

password() 메서드를 호출하여 암호화하지 않으면 접근 거부(HTTP 403) 또는 Internal Server Error(HTTP 500) 발생

사용자 스토어

  • 인메모리
    • 사용자 정보의 추가, 변경이 쉽지 않고 보안 구성 변경 시 빌드, 배포, 설치를 다시 진행하기에 테스트 목적이나 간단한 애플리케이션에 사용
  • JDBC
    • 사용자 정보는 관계형 데이터베이스로 유지, 관리되는 경우가 많으므로 JDBC 기반의 사용자 스토어가 적합

 

LDAP (Lightweight Directory Access Protocol)

출처 : https://www.codeproject.com

인터넷 기반의 분산 디렉터리 서비스를 제공하는 공개된 프로토콜

 

LDAP의 기본 인증 전략은 사용자가 직접 LDAP 서버에서 인증받거나 비밀번호를 비교하게 하는 것

  • 입력된 비밀번호를 LDAP 디렉터리에 전송
  • 전송된 비밀번호를 사용자의 비밀번호 속성 값과 비교하도록 LDAP 서버에 요청
  • 비밀번호 비교는 LDAP 서버에서 수행되므로 실제 비밀번호는 노출X
  • 실제 비밀번호가 서버에 유지되는 것이 장점이지만, 비교되는 비밀번호는 LDAP 서버에 전달될 때 노출 위험 존재
  • 그렇기에 passwordEncoder() 메서드를 통해 암호화 인코더 사용
디렉터리 서비스

특정 이름을 기준으로 대상을 찾아 조회, 편집할 수 있는 서비스
도메인 이름을 기준으로 IP 주소, 데이터를 접근하는 DNS도 일종의 디렉터리 서비스이다.

 

CSRF (Cross-Site Request Forgery)

크로스 사이트 요청 위조

  • 사용자가 로그인한 상태에서 악의적인 코드가 삽입된 페이지 오픈
  • 공격 대상이 되는 웹사이트에 자동으로 폼이 제출
  • 로그인한 사이트는 위조된 공격 명령이 믿을 수 있는 사용자로부터 제출된 것으로 판단하여 공격에 노출

방어

  • 애플리케이션에서는 폼의 숨김 필드에 넣을 CSRF 토큰 생성
  • 숨김 필드에 토큰 추가
  • 폼이 제출될 때, 폼의 다른 데이터와 함께 토큰도 서버로 전송
  • 서버에서는 이 토큰을 원래 생성했던 토큰과 비교
  • 토큰 일치 시, 해당 요청 처리 허용
  • 토큰 불일치 시, 토큰의 존재를 모르는 악의적인 웹사이트의 공격으로 판단

스프링 시큐리티에는 내장된 CSRF 방어 기능 존재, _csrf라는 필드에 토큰을 넣어 폼에 포함시켜 전송하면 된다.

 

 

  •  
728x90
반응형
LIST