[Spring Security] JWT - 4. JWT 로그인 및 권한 처리

2022. 6. 19. 18:56· BE/Spring
목차
  1. 1. JWT 임시 토큰을 만들어서 기본 흐름 확인하기
반응형

이 포스팅은 아래의 강의를 참고하였으니 여기에서 공부하시는 것을 추천드립니다.

https://inf.run/tcLk

 

[무료] 스프링부트 시큐리티 & JWT 강의 - 인프런 | 강의

스프링부트 시큐리티에 대한 개념이 잡힙니다., - 강의 소개 | 인프런...

www.inflearn.com


1. JWT 임시 토큰을 만들어서 기본 흐름 확인하기

1) 컨트롤러에서 권한 테스트 할 함수 만들기

	// user,manager,admin 권한만 접근 가능
    @GetMapping("/api/v1/user")
    public String user(Authentication authentication){
        PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal();
        System.out.println("api/v1/user: " + principalDetails.getUsername());
        return "user";
    }

    // manager,admin 권한만 접근 가능
    @GetMapping("/api/v1/manager")
    public String manager(){
        return "manager";
    }

    // admin 권한만 접근 가능
    @GetMapping("/api/v1/admin")
    public String admin(){
        return "admin";
    }

 

 

2) JwtAuthorizationFilter 생성(권한 처리하는 곳)

package com.cos.jwt.security1.config.jwtConfig;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.cos.jwt.security1.Repository.UserRepository;
import com.cos.jwt.security1.config.jwtAuth.PrincipalDetails;
import com.cos.jwt.security1.model.User;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


// 시큐리티가 filter를 가지는데, 필터중에 BasicAuthenticationFilter 가 있음.
// 권한이나 인증이 필요한 특정 주소를 요청했을 때, 위의 필터를 무조건 탄다.
// 만약 권한이나 인증이 필요한 주소가 아니라면 이 필터를 타지 않는다.
public class JwtAuthorizationFilter extends BasicAuthenticationFilter {

    private UserRepository userRepository;

    public JwtAuthorizationFilter(AuthenticationManager authenticationManager, UserRepository userRepository) {
        super(authenticationManager);
        this.userRepository = userRepository;

    }

    // 인증이나 권한이 필요한 주소 요청 시, 해당 필터를 탄다.
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("인증이나 권한이 필요한 주소");

        String jwtHeader = request.getHeader("Authorization");
        System.out.println("jwtHeader : " + jwtHeader);

        // JWT 토큰을 검증해서 정상적인 사용자인지 확인
        // jwtHeader가 없거나 Bearer로 시작하는 게 아니면 정상적인 토큰이 아니라고 판단
        if(jwtHeader == null || !jwtHeader.startsWith("Bearer")){
            chain.doFilter(request, response);
            return;
        }

        // 받은 JWT헤더에서 Bearer을 없앰
        String jwtToken = request.getHeader("Authorization").replace("Bearer ", "");

        // jwt토큰 확인 작업
        String username =
                JWT.require(Algorithm.HMAC512("cos")).build().verify(jwtToken).getClaim("username").asString();

        // 서명이 정상적으로 됨
        if(username != null){
            User userEntity = userRepository.findByUsername(username);
            PrincipalDetails principalDetails = new PrincipalDetails(userEntity);

            // JWT 토큰 서명을 통해서 서명이 정상적이라면 Authentication 객체를 만들어준다.
            Authentication authentication = new UsernamePasswordAuthenticationToken(principalDetails, null, principalDetails.getAuthorities());

            // 강제로 시큐리티의 세션에 접근하여 Authentication 저장
            SecurityContextHolder.getContext().setAuthentication((authentication));
        }
        chain.doFilter(request, response);
    }
}

 

3) 결과 확인

- 로그인한 사용자의 권한 : ROLE_USER

 

 

- user 주소로 접근 : 접근 가능

 

 

- admin 주소로 접근 : 권한 X (403에러)

 

반응형

'BE > Spring' 카테고리의 다른 글

[Spring] Inteceptor prehandle 에서 response 넘기는 방법  (0) 2023.04.06
[Spring Security] React(Front)와 Spring Security 설정 방법  (2) 2022.07.19
[Spring Security] JWT - 3. JWT 임시 토큰 테스트 및 로그인 시 토큰 생성  (0) 2022.06.18
[Spring Security] JWT - 2. JWT 필터 설정 및 필터 우선순위 적용 방법  (0) 2022.06.11
[Spring Security] JWT - 1. JWT를 공부하기 전에  (0) 2022.06.09
  1. 1. JWT 임시 토큰을 만들어서 기본 흐름 확인하기
'BE/Spring' 카테고리의 다른 글
  • [Spring] Inteceptor prehandle 에서 response 넘기는 방법
  • [Spring Security] React(Front)와 Spring Security 설정 방법
  • [Spring Security] JWT - 3. JWT 임시 토큰 테스트 및 로그인 시 토큰 생성
  • [Spring Security] JWT - 2. JWT 필터 설정 및 필터 우선순위 적용 방법
멍목
멍목
개발 관련 새롭게 알게 된 지식이나 좋은 정보들을 메모하는 공간입니다.
반응형
멍목
김멍목의 개발블로그
멍목
전체
오늘
어제
  • 분류 전체보기 (514)
    • BE (190)
      • Spring (21)
      • Java (141)
      • Kotlin (6)
      • JPA (22)
    • FE (33)
      • Javascript (16)
      • Typescript (0)
      • React (5)
      • Vue.js (9)
      • JSP & JSTL (3)
    • DB (32)
      • Oracle (22)
      • MongoDB (10)
    • Algorithm (195)
    • Linux (8)
    • Git (6)
    • etc (42)
    • ---------------------------.. (0)
    • 회계 (4)
      • 전산회계 2급 (4)
    • 잡동사니 (2)

블로그 메뉴

  • 홈
  • 관리

공지사항

인기 글

태그

  • 코테공부
  • 자기공부
  • MongoDB 공부
  • JPA 공부
  • 전산회계 2급 준비
  • 자바 테스팅 프레임워크
  • Oracle
  • 알고리즘공부
  • 코틀린
  • 자바 공부
  • 자기개발
  • JPA
  • Effective Java
  • 자기 공부
  • Java to Kotlin
  • 이펙티브자바
  • java 8
  • 코테 공부
  • 알고리즘 공부
  • 더 자바 애플리케이션을 테스트하는 다양한 방법
  • MongoDB with Node.js
  • 자기 개발
  • 이펙티브 자바
  • 자바공부
  • 프로젝트로 배우는 Vue.js 3
  • MongoDB 기초부터 실무까지
  • 더 자바 Java 8
  • vue3 공부
  • 자바 개발자를 위한 코틀린 입문
  • junit5

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
멍목
[Spring Security] JWT - 4. JWT 로그인 및 권한 처리
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.