Spring Security, JWT로 인증, 인가 구현하기

2024. 1. 13. 00:12·Dev

인증(Authentication)과 인가(Authorization)

  • 인증은 사용자가 누구인지 확인하는 절차, 회원가입하고 로그인 하는 것을 말한다.
  • 인가는 사용자가 서비스에서 제공하는 기능을 사용할 수 있는 권한이 있는지 확인하는 절차를 말한다.

Spring Security

  • Spring Security는 filter chain을 기반으로 인증과 인가를 수행해서 보안 기능을 제공한다.
  • filter는 http 요청이 들어오면 filter에 통과 시켜서 보안 작업을 수행합니다.
    • 로그인 같은 요청은 예외 처리를 통해 인가 작업이 없어도 사용 가능하도록 설정 가능

Spring Security 처리 과정

  1. 처음에 요청이 들어오면 AuthenticationFilter(UsernamePassAuthenticationFilter)를 거친다.
  2. 요청에 따른 UsernamePasswordAuthenticationToken을 생성한다. (Authentication 인터페이스의 구현체다.)
  3. UsernamePasswordAuthenticationToken(alias Token)을 AuthenticationManager에게 이 Token은 올바른 유저인지 물어본다.
  4. AuthenticationManager는 1개 이상의 AuthenticationProvider(alias A-Provider)를 갖고 있는데, A-Provider는 Token 객체를 적절히 판단하여 인증처리를 할려고 한다.
  5. A-Provider가 우리가 직접 구현한 서비스(UserDetailsService 구현 클래스)에 해당 유저에게 인증요청을 보내 사용자 정보를 가져온다.
  6. UserDetailsService 구현 클래스는 사용자 정보를 가져와 UserDetails를 반환한다.
  7. Provider는 UserDetailsService에서 반환된 UserDetails와 클라이언트가 제공한 인증정보(Token)를 대조해서 이용자가 정당한 사용권한을 가지고 있는지 확인한다.
  8. 그리고 SecurityContext에 저장한다.

사용자 정의 filter

  • jwt를 사용해서 구현하는 경우 사용자 정의 filter를 구현해야 합니다.
  • JWT의 유효성 검사 -> 토큰이 만료된 것인지 유효한지에 대해서 체크해야한다.
  • 사용자 정의 인증 로직 -> 외부 API 등을 호출해야하는 경우에 이를 처리하기 위해서 필터를 추가 구성한다.
  • 권한 부여 -> JWT 토큰은 주로 인증에 사용되지만, 권한 부여를 사용해서 특정 리소스에 대한 접근 권한을 확인해야하기에 사용자가 특정 엔드포인트를 필터에 추가 구성한다.
  • 추가 보안 -> XSS, CSRF 공격 등과 같은 보안 취약점 방지를 위한 필터를 추가로 구성한다.

JWT(JSON Web Token)

  • 인증 및 권한과 관련된 정보를 안전하게 전달하기 위한 JSON 형식의 암호화된 문자열
  • JWT는 헤더, 페이로드, 시그니처로 구성되어 있다.
    • 헤더: 정보(토큰)의 종류와 암호화 알고리즘 저장
    • 페이로드: 암호화한 정보(전송할 데이터)를 저장
    • 헤더와 페이로드를 검증하기 위한 정보를 저장

장점

  • 간단하고 가벼운 구조로 전송에 효율적이다.
  • HTTP 헤더에 포함하여 전송할 수 있어서 별도의 인증 프로토콜을 구현할 필요가 없다.
  • 다양한 언어와 플랫폼에서 사용 가능

동작 방식

  • 서버는 사용자의 인증 정보를 사용하여 JWT를 생성한다.(아이디와 비밀번호로 DB와 일치하는지 확인)
  • 클라이언트가 JWT 토큰을 저장하고 있다가 요청마다 헤더에 JWT 토큰을 담아서 보내서 서버가 권한을 확인한다.

 

 

 

 

출처 : https://velog.io/@mooh2jj/Security-%EC%9D%B8%EC%A6%9D%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC#spring-security%EC%9D%98-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0
https://velog.io/@sujin-create/Spring-spring-security%EC%99%80-JWT-%EC%9D%B8%EC%A6%9D-%EC%9D%B8%EA%B0%80-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0#3-jwt%EC%99%80-spring-security-%ED%95%A8%EA%BB%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

'Dev' 카테고리의 다른 글

fcm 이용해서 앱 푸쉬 구현  (0) 2024.12.04
소켓 통신(채팅방 구현)  (0) 2024.12.04
OCR로 영수증 데이터 가져와서 식품 데이터 분류하기(분류 모델 만들기) + Trouble shooting  (0) 2024.12.04
ElasticSearch로 검색 성능 높이기  (0) 2024.12.04
Swagger 사용하기  (1) 2024.12.04
'Dev' 카테고리의 다른 글
  • 소켓 통신(채팅방 구현)
  • OCR로 영수증 데이터 가져와서 식품 데이터 분류하기(분류 모델 만들기) + Trouble shooting
  • ElasticSearch로 검색 성능 높이기
  • Swagger 사용하기
khjoon
khjoon
  • khjoon
    기록기록
    khjoon
  • 전체
    오늘
    어제
    • 분류 전체보기 (37)
      • Security (2)
      • Dev (14)
      • Infra (12)
      • Ops (9)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
khjoon
Spring Security, JWT로 인증, 인가 구현하기
상단으로

티스토리툴바