security 기본
본 내용은 최주호님의 스프링부트 시큐리티 & JWT 강의를 듣고 정리한 내용 입니다.
참고한 깃허브
직접 코드를 수정하고 실행해보면서 테스트 해보는게 이해하기 제일 좋습니다.
기본형태
제일 기본적인 형태를 보려면 Config쪽에 WebMvcConfig 만 남기고 주석처리, controller 에는 아래 / 경로만 설정해준다.
시큐리티 의존성을 설치 해주면 처음엔 기본적으로 http://localhost:8080/login으로 이동했을때 로그인 페이지가 생김, application.yml 에 아래처럼 시큐리티 설정을 해주면 해당 계정으로 로그인이 가능하다.
로그인을 하면 / 경로로 이동한다.
로그인 및 권한설정
/ 경로를 로그인한 유저만 접근가능하고, /admin 경로는 어드민만, /manager 경로는 매니저만 접근 가능하도록 권한설정을 해주는 방법
config 아래 SecurityConfig 를 생성하여 시큐리티 설정을 해준다. 원래는 /login 으로 이동하면 스프링 시큐리티가 낚아 챘는데 설정을 해주면 작동안함
@EnableWebSecurity : 스프링 시큐리티 필터가 스프링 필터 체인에 등록이 됨
위와 같은 방식으로 특정 경로에 권한 설정을 해줄수있다. loginPage() 설정으로 인해 권한없는 페이지로 이동시 에러페이지가 뜨는게 아니라 로그인 경로로 이동됨
loginProcessingUrl로 인해서 시큐리티가 로그인을 대신 진행해주어 컨트롤러에 따로 만들 필요가 없다.
패스워드
패스워드를 꼭 암호화 해주어야 하기 때문에 SecurityConfig에 아래와 같은 코드도 설정해준다.
컨트롤러에서 회원가입시에 아래처럼 암호화해주면 된다.
UserDetails
시큐리티가 낚아채서 로그인을 진행 시킬때 로그인이 완료가 되면 시큐리티 session을 만들어낸다. 시큐리티의 세션이 존재함. (Security ContextHolder)
세션에 들어갈수있는 오브젝트 => Authenticaion 타입 객체로 정해져 있다.
Authenticaion 안에 User 정보가 있어야 됨
User 오브젝트 타입 => UserDetails 타입 객체로 정혀져 있다.
UserDetails 를 구현하는 PrincipalDetails 가 필요하다.
getAuthorities
getAuthorities 는 해당 유저의 권한을 리턴하는데 현재 유저의 권한은 role로 스트링타입이다. 근데 타입이 정해져있으니 Collection<GrantedAuthority> 객체를 생성해주어야한다. (ArrayList는 Collection의 자식)
isEnabled
사이트에서 1년동안 로그인 안하면 휴면 계정으로 변경할때, 컬럼에 login할때마다 날짜를 저장하는 컬럼을 두고 그걸로 현재시간과 로그인 시간의 차이가 1년을 초과했을때 리턴은 false로 하면됨
UserDetailsService
로그인시 스프링은 IoC컨테이너에서 UserDetailsService 빈을 찾아 loadUserByUsername을 호출함
username 파라미터를 가져옴(클라이언트에서 넘겨준 이름 그대로)
UserDetails 로 리턴된 값은 Authentication 내부로 들어감. 그리고 그 객체는 또 세션으로 들어가니 다음과 같은 모양새가 됨.
시큐리티 session(내부 Authentication(내부 UserDetails))
특정주소에 직접 권한걸기
SecurityConfig 에 아래와같은 어노테이션을 걸어주면 특정어노테이션이 활성화가 된다.
securedEnabled는 @Secured 를 활성화 하고
prePostEnabled는 @PreAuthorize 와 @PostAuthorize 를 활성화 시킴
그리고 아래와 같이 사용한다.
websecurityconfigureradapter deprecated 문제
이 문제로 인해 SecurityConfig를 다르게 변경해주어야한다.
Last updated