Spring Security
- Spring 기반의 어플리케이션의 보안(인증과 권한, 인가 등)을 담당하는
스프링 하위 프레임워크 - ‘인증’과 ‘권한’에 대한 부분을 Filter 흐름에 따라 처리
Spring Security의 구조
- 세션-쿠키방식으로 인증
세션에 사용자 정보를 저장한다는 것
= 전통적인 세션-쿠키 기반의 인증 방식을 사용한다는 것을 의미
1. 유저가 로그인을 시도하면
사용자가 입력한 정보를 가지고 인증을 요청한다. (Request)
2. AuthenticationFilter는 이를 가로채
UsernamePasswordAuthenticationToken(인증용 객체)를 생성한다.
3. 필터는
요청을 처리하고
AuthenticationManager의 구현체 ProviderManager에
Authentication과 UsernamePasswordAuthenticationToken을 전달한다.
4. AuthenticationManager는
검증을 위해 AuthenticationProvider에게
Authentication과 UsernamePasswordAuthenticationToken을 전달한다.
5. DB에 담긴 사용자 인증정보와 비교하기 위해
UserDetailsService에 사용자 정보를 넘겨준다.
6. user DB로 들어가
존재하는 유저라면
UserDetails 로 객체를 만든다.
7. AuthenticationProvider는
UserDetails를 넘겨받고 비교한다.
8. 인증이 완료되면
권한과 사용자 정보를 담은 Authentication정보를 전달한다.
9. 그 후 AuthenticationFilter까지 Authentication 객체가 반환된다.
10. Authentication정보는
SecurityContextHolder 세션 영역에 있는 SecurityContext에
UsernamePasswordAuthenticationToken(Authentication) 객체를 저장하고,
➡️ 성공시 AuthenticationSuccessHandle를 실행 ➡️ 실패시 AuthenticationFailureHandler 실행
JWT
JSON 포맷을 이용해 정보를 가볍고 안전하게 전송하기 위한
Claim 기반의 Web Token일반적으로 클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한 인가(Authorization)을 위해 사용하는 토큰
사용자 로그인 시 서버는 사용자 인증을 완료하고
외부에 노출되어도 문제가 없는 인증관련 정보(사용자 ID, 권한 등)를 JSON 형태로 만든다.
이 데이터를 base64 인코딩을 해서 문자열을 만들고,
미리 정한 시스템의 SecretKey를 이용하여 서명 문자열을 생성한다.
JWT 구조
일반적으로 JWT의 구조는
헤더, 페이로드, 서명 세 부분을 점으로 구분된다.
HEADER.PAYLOAD.SIGNATURE
- 헤더: 토큰 타입과 해싱 알고리즘
- 페이로드: 실제로 전달하는 정보
- 서명: 위변조를 방지하기 위한 값
JWT 발급 과정
1. 클라이언트에서
로그인에 검증 가능한 ID, PW를 실어서 서버로 보낸다.
2. 서버는 사용자 인증이 완료될 시
JWT토큰을 생성해서 Body에 담아 클라이언트에게 응답한다.
3. 클라이언트는
앞으로 로그인을 제외한 다른 api를 요청할 때마다
header에 토큰을 실어서 보낸다.
4. 서버에서는 다시 header에 실려온 토큰을 검증후 인증되면 응답을 해준다.
(권한이 있는 사용자에게 리소스를 제공)
(참고링크)
- [Spring] Spring Security와 JWT 개념
- (4) 로그인1 -SpringSecurity & JWT 개념
- OpenAPI API 인증
- [JWT] JSON Web Token 소개 및 구조
공부한 내용을 여러글과 책 읽은 내용을 바탕으로 정리하고 있습니다.
좋은 글로 저의 공부에 도움을 주시는 분들께 감사드립니다.



