Spring Security / JWT

2021. 8. 14. 23:29Spring

Spring Security

스프링 기반의 애플리케이션 보안을 담당하는 프레임워크로 Filter 기반으로 동작하기 때문에 Spring MVC와 분리되어 동작한다.

  • 접근 주체(Principal) : 보호된 대상에 접근하는 유저
  • 인증(Authenticate) : 요청을 보낸 유저가 누구인지 확인
  • 인가(Authorization) : 현재 유저가 어떤 서비스, 페이지에 접근할 수 있는 권한을 부여

Spring Security 동작

  1. AuthenticationFilter(UsernamePasswordAuthenticationFilter)는 사용자의 요청을 가로챈다. 그리고 인증이 필요한 요청이라면 사용자의 JSESSIONID(쿠키로 발급하여 값을 통해 세션을 유지할 수 있도록 한다./이전에 접근 여부를 확인할 수 있다.)가 Security Context에 있는지 판단한다. 없으면 로그인 페이지로 이동시킨다.
    로그인 페이지에서 요청이 온 경우라면 로그인 페이지에서 입력받은 username와 password를 이용해 UsernamePasswordAuthenticationToken을 만든다. 그리고 UsernamePasswordAuthentication Token정보가 유효한 계정인지 판단하기 위해 AuthenticationManager로 전달한다.
  2. AuthenticationManager 인터페이스의 구현체는 ProviderManager이고 AuthencationProvider에게 비밀번호 인증 로직 책임을 넘긴다.(AuthencationProvider는 개발자가 직접 커스텀해서 비밀번호 인증 로직을 직접 구현할 수 있다.)
  3. AuthenticationProvider는 UserDetailsService를 실행해 비밀번호 인증 로직을 처리한다.
    UserDetailsService는 DB에 저장된 회원의 비밀번호와 비교해 일치하면 UserDetails인터페이스를 구현한 객체를 반환하는데, UserDetailsService는 인터페이스이며 UserDetailsService를 구현한 서비스를 직접 개발해야 한다.
  4. 인증 로직이 완료되면 AuthenticationManager는 Authentication를 반환하며, 결과적으로 SecurityContext에 사용자 인증 정보가 저장된다.
  5. 인증 과정이 끝났으면 AuthenticationFilter에게 인증에 대한 성공 유무를 전달한다.
    참조 : https://bamdule.tistory.com/52

JWT(JSON Web Token)

JSON객체로 서버-클라이언트 간에 정보를 전송하기 위한 방법

토큰의 타입 + 암호화 알고리즘 방식

Payload

Claims(요구사항이나 정보)

  1. Registered Claims
    • Claims
      • iss : jwt발행자
      • sub : jwt사용자
      • and : jwt 수신자
      • exp : 만료시간
      • nbf : jwt가 처리를 위해 승인되지 않아야 하는 시간
      • iat : jwt가 발행 된 시간
      • jti : 고유식별자(토큰을 한 번만 사용할 수 있음)
  2. Public Claims : 사용자 마음대로 정의 가능, 충돌을 방지하기 위해 정해진 규칙 내에서 정의해야 한다.
  3. Private Claims : 사용자 정의이지만 서버-클라이언트가 공유하기 위한 정보

Signature

토큰이 유효한지, 위변조 여부를 판단하기 위한 것
인코딩 된 Header과 Payload, secret, algorithm이 필요

Access Token + Refresh Token 인증 과정

참조 : https://tansfil.tistory.com/59

 

반응형