인증 : 해당 사용자가 본인이 맞는지 확인
인가 : 인증된 사용자가 요청한 자원에 접근 가능한지 권한 확인
Principal (접근주체) : 보호받는 Resource 에 접근하는 대상
Credential (비밀번호) :Resource 에 접근하는 대상의 비밀번호
인증 -> 인증 성공 후 -> 인가
인증과 인가를 위해 principal 을 아이디로, Credential 을 비밀번호로 사용한다.
스프링 시큐리티의 구조
1. AuthenticationFilter 에서 Http 요청을 받는다.
2. 해당 부분에서는 request 로 부터 username, password 를 가지고 와서 UsernamePasswordAuthenticationToken을 생성한다.
3. 생성된 UsernamePasswordAuthenticationToken 을 가지고 AuthenticationManager(인터페이스, 구현체인 providerManager) 에게 인증을 진행하도록 위임한다.
* UsernamePasswordAuthenticationToken 은 Authentiocation의 인터페이스의 구현체이다.
4. AuthenticationProvider 가 실질적인 인증과정을 거쳐서 인증에 성공하면 요청에 대해 ProviderManager 가 인증이 되었다고 알려준다.
* ProviderManger 의 역할은 과정을 처리해줄 AuthenticationProvider 을 찾고, 응답을 받는 역할을 한다.
5. AuthenticationProvider 에서는 받은 UsernamePasswordAuthenticationToken 을 UserDetailsService 에 사용자 정보를 넘겨준다.
* UserDetailsService 은 실제 데이터베이스에서 사용자 인증정보를 가져온다.
6. 넘겨받은 사용자 정보를 통해 UserDetails 객체를 만든다.
7. AuthenticationProvider 는 Userdetails 를 넘겨받고 사용자 정보를 비교한다.
8. 인증이 완료되면 사용자 정보를 담은 Authentication 객체를 반환한다.
9. 처음 요청받은 AuthenticationFilter 에 Authentication 객체가 반환된다.
10. Authentication 객체를 SecurityContext 에 저장한다.
스프링시큐리티 + JWT 동작과정
1. 클라이언트에서 ID / PW 로그인 요청을 한다.
2. 서버 DB 에 요청받은 ID / PW 가 있다면, Access Token 과 Refresh Token을 발급해준다.
3. 이후 클라이언트에서는 요청을 할 때 Access Token을 헤더에 담아 서버가 허용한 API 를 사용할 수 있다.
보통 Access Token 은 짧게 설정(보안문제) 하고 Refresh Token 은 길게 설정을 한다.
Refresh Token 을 이용해 만료된 Access Token을 재발급 받을 수 있다.
만약 Refresh Token 이 유출이 된다면, 서버에서는 두 토큰을 모두 폐기시켜야 한다.
국제 인터넷 표준화 기구에서는 Refresh Token 과 Access Token 을 같은 유효시간을 갖게해서 사용자가
Refresh Token 을 사용해 Access Token을 재발급 받았다면 Refresh Token 과 Access Token 를 다시 재발급 받는 것을 권장하고 있다고 한다.
'Spring > Spring-Security' 카테고리의 다른 글
SpringSecurity Enum 타입으로 권한 설정하기 (0) | 2023.02.07 |
---|---|
Spring Security + JWT 로그인 구현하기 (Access Token) (0) | 2023.01.23 |
SpringSecurity DB 없이 테스트 방법 (0) | 2022.10.20 |
JWT (Json Web Token) 의 개념 (0) | 2022.10.19 |
세션(서버) 기반 VS 토큰 기반 차이 (0) | 2022.10.19 |
댓글