Spring Security를 활용한 Form 로그인과 JWT 기반 인증 구현

두부링·2025년 3월 13일

Spring

목록 보기
18/24

Form 로그인(세션 사용 x)

  • 토큰에 담는 정보는 subject(주요한 정보 = userName) , claims (부수적 정보 = role)
  • 시큐리티가 알아서 userName, password 비교 대조한 후 일치하면 AuthSuccessHandler 가 실행된다.
  • AuthSuccessHandler 가 Role 을 얻어와서 claims 에 저장
  • subject(주요한 정보 = userName) , claims (부수적 정보 = role) 로 토큰이 만들어짐
  • 서버가 보내면 웹브라우저에 저장되고 같은 서버에 요청할 때 쿠키는 자동으로 보내짐

AuthSuccessHandler 로 토큰이 발급되고 쿠키에 저장된다.

  • 로그인 시점에 받은 쿠키를 항상 달고 가면 JWTFilter 로 먼저 들어간다.
  • 토큰을 기반으로 Jwtfilter가 사용자가 일치하는지? 유효한 기간인지? 검증 후 응답을 보내줌

Jwtfilter -- jwtUtil -- customproperties

  • jwtUtil = 토큰을 뽑아오고 만드는 메서드
  • customproperties = 토큰에 관한 설정(유효시간...)

특정 메소드의 접근 권한

  • 특정 메서드는 특정 role 만 접근 가능하게끔
  • SecurityConfig 설정
  • 컨트롤러 설정

로그인 실패시

role 정보(한가지) 간단하게 담기

  • User.withUsername 사용해서 . 으로 간단하게 UserDetails 객체 만들기

Final API

  • 프로젝트 생성 : DB에서 직접 데이터를 가져와서 진행

회원가입 접속 허락

  • api 의 post/user 은 가입이니 토큰이 있을리가 없으므로 회원가입은 접속허락
  • POST /user 은 회원가입
  • whitelist 에 작성하면 get 도 받아들이니 작성하면 안됨

CustomUserDetailsService

  • 로그인 처리시 호출하는 메서드로
  • CustomUserDetailsService 에서 dao으로 가져오기에 Security의 authManager 는 실제 데이터를 가져와서 인증 작업을 거친다.

로그인 요청시

  • JWT filter 로 토큰 검사 유효하다면 -> Security 프리패스 -> 원하는 응답

  • useController 에서

  • 검증매니저가 userName 과 password 로 일치하면 토큰에 userName 과 role 을 담아서 토큰 발급

  • userName, password 기억하삼

  • userController - jwtUtil , SecurityConfig 의 AuthenticationManager 사용
  • AuthenticationManager 에서 userController 에서 얻은 데이터와 CustomUserDetailsService 에서 DB에서 얻어와서 비교함

내가 auth 요청 즉 올바른 로그인 요청을 보내면 토큰이 없으니 JWT filter 를 통과하고 시큐리티에 /auth 를 작성했으니 시큐리티도 통과하고 usercontroller 의 authManagr 로 사용자 검증 후에 토큰을 발급하는 흐름

  • props ? 부모 요소에서 관리되는 loginModal.show의 값을 갖고오고 그걸 관리할 권한을 준다.

  • 즉 여기서 {...props} 는 부모요소가 관리하는 show 데이터를 갖고오고 관리권한을 준다.

    요소 안에 props 는 부모가 관리하는 값과 그걸 변경할 권한을 준다.

  • API 로그인 요청 시 응답받은 것 = 토큰

  • 웹브라우저에서 디코딩해서 담긴 정보중 userName 과 role 을 사용한다.

API = 토큰 매개체로 상호응답

me-auto

  • me-auto : 오른쪽 마진을 다 차지해서 왼쪽 정렬
  • mt , me, mb , ms 으로 사용한다.
  • conatiner 안에서 오른쪽 마진을 다 차지해서 왼쪽으로 정렬된다.
  • 그리고 혹시 container 안에서 me-auto 가 2개라면 적당히 알아서 차지하면서 오른쪽 정렬
  • bootstrap 의 마진
  • css 의 마진
    margin top , right , bottom , left 을 사용함

보완

  1. 인코딩 = 암호화

  2. UserDetail 정보는 어디서 활용이 되는가?

    CustomUserDetailsService(UD) 는 시큐리티에서 DB 정보를 끌어오기 위해서 사용

  3. auth 와 role , DB에는 뭐가 저장되었는지?

    authority 는 "ROLEUSER" 등으로 저장됨 = DB
    role 는 USER 으로 저장된다. = 우리가 뽑는 형식
    즉, DB 에 저장할 때는 앞에 "ROLE
    " 을 붙이고 authorty 으로 저장해야 한다.

profile
하이하잉

0개의 댓글