sol 개발 블로그 로고
Published on

Spring Security를 사용해야하는 이유와 배경

Authors
  • avatar
    Name
    Chan Sol OH
    Twitter

목차

개요

배포 서버를 공격하려는 다양한 시도들 때문에 보안 취약점이 밝혀지고 개인 정보가 유출되면 큰 손실이 발생하기 때문에 보안에 관련된 기능를 개발할 때는 주의를 기울여야합니다. 이런 다양한 공격을 대비한 기능을 한 팀이 전부 만드는 것은 현실적으로 어렵습니다. 그렇기 때문에 보안을 위해 노력하는 개발자들이 개발한 Spring Security를 사용하는 겁니다.

Spring Security는 모든 보안 시나리오에 대해 고려해서 작성된 프레임워크입니다. 따라서 CSRF, CORS 같이 흔히 사용되는 보안 취약점들에 대해 업데이트합니다. 또한 Spring Security는 사용자에게 역할을 부여하고 역할 기반으로 자원을 접근할 수 있게하는 역할 기반 메커니즘을 구현합니다.

Security는 ID/Password, OAuth2, OpenIDs, Jwt Tokens 같은 다양한 인증 인가 방식을 지원합니다.

Spring Security 내부 동작

spring security 내부 동작

위 그림은 유저가 웹 서버에 HTTP 요청했을 때 security filter를 통해 인증을 하는 과정을 나타냅니다.

  1. 유저가 웹 서버에 HTTP 요청을 보냈을 때, filter가 요청을 가로챕니다.
  2. Spring Security Filter가 유저의 요청에서 자격증명 부분을 추출해서 Authentication 객체를 생성합니다.
  3. Authentication ManagerAuthentication의 유효성을 검사하기 위해 여러 Authentication Provider에게 인증을 요청합니다.
  4. Authentication ProvidersAuthentication의 유효성을 검사하는 여러 비즈니스 로직을 담고있습니다.
  5. UserDetails Manager/Service는 DB, 캐시 서버 등에 저장된 유저 자격증명을 확인하고 유효성을 검사합니다.
  6. Password Encoder는 비밀번호를 암호화 하거나 해싱하는 로직을 제공합니다.
  7. Authentication Manager는 유효성 검사를 성공할 때까지 여러 Authentication Provider에게 검사를 위임합니다.
  8. Filter에게 인증 결과를 전달합니다.
  9. Authentication 객체를 SecurityContext 안에 저장합니다. SecurityContext는 클라이언트 요청 당 하나가 저장되며 SecurityContextHolder가 관리합니다.
  10. 클라이언트에게 인증 결과를 바탕으로 성공하면 보호된 자원으로 부터의 응답을 반환하거나 실패하면 인증 실패를 전달합니다.

유저에 대한 CRUD와 Security의 관심사

유저에 대한 CRUD를 하는 방법은 Security에서 제공하는 UserDetailsManager 인터페이스를 구현해서 CRUD를 구현하는 방식과 실제 RestAPI를 이용해서 유저를 등록하는 엔드포인트를 제공하는 방식입니다.

Spring Security는 저장 장치에 저장된 유저 정보를 바탕으로 클라이언의 요청을 인증하는 것만 잘 수행하면 된다고 생각해요. 그래서 JdbcUserDetailManager에서 제공하는 기본 User 스키마가 마음에 들이 않을 때 커스텀한 UserDetailsService를 구현하면돼요. 꼭 유저 등록, 수정, 삭제까지 Security에 의존할 필요는 없습니다.

Resource 서버로 역할

만약 MSA 상황을 가정해보자. 유저가 OAuth2.0, UserNameAndPassword 등등 다양한 방식으로 Authentication을 진행한 후, 인증 정보를 포함한 jwt를 발급 받는다. 다른 Resource 서버들은 그 jwt를 통해 어떤 유저가 우리 서버에 요청했을까? 를 확인할 수 있다. 어떤 유저인지를 확인하면, jwt에 포함된 GrantedAuthority 값을 통해 유저가 해당 요청할 권한이 있는지 확인하고 요청에 응답한다.

Spring Security는 Resource 서버로 동작하는 과정을 미리 만들어두고, 개발자는 필요한 부분 (ex jwt converter, uri에 대한 역할 등등)만 지정해주면 편하게 Resource 서버를 구축할 수 있다.

To Do

앞으로 jwt를 발급하는 인증 서버를 KeyCloak으로 구현하고 다른 마이크로 서비스가 jwt를 통해 인증하는 방식을 포스팅하려고 한다.