[Spring Security] JWT의 적용(JSON Web Token)

JiKwang Jeong·2021년 10월 12일
0
post-custom-banner

Spring Security

Spring Security는 엔터프라이즈 애플리케이션에 대한 인증, 권한 부여 및 기타 보안 기능을 제공하는 Java / Java EE 프레임워크이다.
인증(Authentication)은 작업을 수행할 수 있는 주체임을 증명하는 과정이고, 권한(Authorization)은 인증된 주체가 작업을 수행할 수 있또록 승인되었는지를 확인하는 과정이다.

Spring Security 구조

Spring Security를 사용하면 사용자 임의의 인증 로직을 간단하게 구현할 수 있다.

1. 사용자 요청 확인 후 Token 객체 생성 및 반환
2. 적절한 Provider 호출
3. Token 검증 후 Authentication 객체 생성 및 반환
4. 인증 성공 구현

JSON Web Token 적용

Spring Security 인증 구조에 JSON Web Token을 적용하기 위해, 사용자의 로그인 요청을 처리하는 필터(CustomAuthenticationFilter)와 데이터베이스에 암호화 되어 저장된 패스워드 검증을 수행하는 구현체(UserDetailServiceImpl)를 추가한다.
또한, JWT 검증을 통해 사용자 인증을 수행하는 필터(JwtTokenAuthenticationFilter)도 추가한다.

JSON Web Token 발행

로그인 및 JWT 발행 절차는 다음과 같다.
1. 로그인 URL로 접속 시, CustomAuthenticationFilter의 attemptAuthentication()가 호출 됨
2. HttpRequest에서 username, password 정보 객체화
3. 로그인 정보로 AuthenticationManager에서 사용할 수 있는 UsernamePasswordAuthenticationToken 생성
4. AuthenticationManager의 authentiation() 호출
5. AuthenticationManager가 내부적으로 DaoAuthenticationProvider 할당
6. DaoAuthenticationProvider의 retrieveUser() 에서 UserDetailsService 구현체 호출
7. UserDetailsService의 loadUserByUsername() Method가 실제 DB에서 사용자 정보를 조회하는 로직
8. loadUserByUsername() Method에서 조회된 사용자 정보로 User 객체 생성 및 반환
9. DaoAuthenticationProvicer의 additionalAuthenticationChecks() Method에서 패스워드 비교
10. AbstractUserDetailsAuthenticationProvider의 authenticate() Method에서 createSuccessAuthentication() Method 호출
11. CustomAuthenticationFilter의 successfulAuthentication() Method에서 JWT 발행

JSON Web Token 검증

JWT 검증 절차는 다음과 같다.
1. REST API URL로 접속 시, JwtTokenAuthenticationFilter의 doFilterInternal() Method가 호출 됨
2. HttpRequest에서 Authentication 헤더 추출
3. 헤더 유무 및 Bearer 여부 체크
4. JWT 추출 및 검증
5. Principal, Credentials, Authorities 정보를 통해 UsernamePasswordAuthenticationToken 생성
6. SecurityContextHolder에 인증 토큰 등록
7. 이후 Controller에서 권한 및 사용자 정보 등을 확인할 수 있음

Throw Exception

인증 과정에서 발새알 수 있는 예외 처리는 다음과 같다.

Security Context Holder

현재 실행되는 Thread의 Security Context 정보를 담고 있는 일종의 저장소로, 현재 사용자의 정보를 전달하고 획득할 수 있다.

profile
기억보다 기록, 난리보다 정리
post-custom-banner

0개의 댓글