본문 바로가기

개발/Spring

[Spring] Security 정리(1)

지금 실무에서 사용하고 있는 스프링 보안은 인터셉터를 활용하여 구현되어 있으나, 필터를 기반으로 동작하는 스프링 시큐리티에 대해서 확실히 알 필요가 있다고 생각하여(사용은 해보았지만..원리는 잘 모르고 썼었다), 정리해보려고 한다.

 

1. 스프링 시큐리티의 정의

  • 스프링 기반의 애플리케이션의 보안을 담당하는 프레임워크이다. 시큐리티를 사용하지 않고 직접 인증, 인가를 구현한다면, 자체적으로 세션을 체크하고, 페이지를 redirect 해주는 등 직접 손보아야 할 일이 많아질 것이다.

2. 보안 관련 용어 정의

  • 접근 주체(Principal) : 보호된 대상에 접근하는 유저
  • 인증(Authenticate) : 현재 접근하는 유저가 누구인지 확인, 애플리케이션의 작업을 수행할 수 있는 주체임을 증명
  • 인가(Authorize) : 접속한 유저가 어떤 서비스와 페이지에 접근 할 수 있는 권한이 있는지 검사
  • 권한 : 인증된 주체가 애플리케이션의 동작을 수행할 수 있도록 되어있는지 결정
    • 권한 승인이 필요한 부분으로 접근하려면 인증 과정을 통해 주체가 증명 되어야 한다.
    • 권한 부여 영역
      • 웹 요청 권한
      • 메소드 호출 및 도메인 인스턴스에 대한 접근 권한

아키텍처

스프링 시큐리티 아키텍처

시큐리티 동작 프로세스

  1. 유저가 로그인을 시도 (http request)
  2. AuthenticationFilter 에서부터 위와같이 user DB까지 타고 들어감
  3. DB에 있는 유저라면 UserDetails 로 꺼내서 유저의 session 생성
  4. spring security의 인메모리 세션저장소인 SecurityContextHolder 에 저장
  5. 유저에게 session ID와 함께 응답을 내려줌
  6. 이후 요청에서는 요청쿠키에서 JSESSIONID를 까봐서 검증 후 유효하면 Authentication를 쥐어준다.

시큐리티 세션 등록 과정

  • 세션에 시큐리티 컨텍스트(Authentication 객체만 저장 가능)가 생성이 되고, Authentication 객체가 생성됨.
  • Authentication 객체는 AuthenticationManager가 만드는데, 사용자가 로그인 요청을 하면 username과 password를 바탕으로 AuthenticationFilter(인증필터)가 가로채서 UsernamePasswordAuthenticationToken을 생성하여 AuthenticationManager에 던지면 AuthenticationManager가 세션을 만든다. 
    • 조건 : username이 UserDetailSservice에게 보내 UserDetailsService가 DB에 username이 있는지 질의를 한다 .

  • 조건에 부합한다면 패스워드를 Bcrypt로 암호화하여 DB에 암호화된 password가 맞는지 확인하여 맞다면, Authentication 객체를 만들어 세션에 저장
  •  

 

ps. 스프링 시큐리티는 한 포스팅으로 다 담기에는 너무 영역이 넓다. 나누어서 포스팅 할 예정..