[SpringBoot] 스프링부트 프로젝트 시작하기 - 6. 토큰 이용하여 인가된 사용자 걸러내기

2024. 6. 28. 23:39·Spring

버전

  • SpringBoot 3.3.0
  • Java 17
  • JWT 0.12.5

목표

  1. 토큰을 통해 인가된 사용자 구분하기
  2. Deprecated 된 함수 사용하지 않기

구현

이전 포스팅에서 로그인 시 토큰을 발행하는 부분까지 구현을 했다. 이번 포스팅에서는 해당 토큰을 이용하여 회원정보 요청을 보내고, 인가된 사람에게만 정보를 반환하는 부분을 구현해본다.

MemberInfoResponse

package com.study.springStarter.member.controller.response;

import com.study.springStarter.member.entity.Member;
import lombok.Data;

@Data
public class MemberInfoResponse {
    private String loginId;
    private String name;
    private String email;

    public MemberInfoResponse(Member member) {
        this.loginId = member.getLoginId();
        this.name = member.getName();
        this.email = member.getEmail();
    }
}

우선 회원 정보를 반환해줄 response를 만들어준다. 생성자를 통해 Member를 response로 변환하도록 하였다.

 

MemberService

/**
 * 정보조회
 */
public MemberInfoResponse memberInfo(Long userId) {
    Member findMember = memberRepository.findById(userId).orElseThrow(() ->
            new InvalidInputException("token", "회원 정보가 존재하지 않습니다."));
    return new MemberInfoResponse(findMember);
}

 

MemberController

@GetMapping
public BaseResponse<?> myInfo() {
    Long userId = ((CustomUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUserId();
    return BaseResponse.ok(memberService.memberInfo(userId));
}

토큰을 제대로 넣어 보냈고, 토큰이 유효하다면 컨트롤러에서 위처럼 SecurityContextHolder에서 유저 아이디를 가져올 수 있다.

SecurityConfig

package com.study.springStarter.common.authority;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@RequiredArgsConstructor
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private final JwtTokenProvider jwtTokenProvider;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .httpBasic(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable)
                .sessionManagement(sessionManagement
                        -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(request -> request
                        .requestMatchers("/api/member/signup", "/api/member/login").anonymous()
                        .requestMatchers("/api/member/**").hasRole("MEMBER")
                        .anyRequest().permitAll()
                )
                .addFilterBefore(
                        new JwtAuthenticationFilter(jwtTokenProvider),
                        UsernamePasswordAuthenticationFilter.class
                );
        return http.build();
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

SecurityConfig에서 `.requestMatchers("/api/member/**").hasRole("MEMBER")`를 통해 위에 MEMBER권한이 있는 사용자를 명시했는지 확인하고 테스트를 해보자

로그인 후 발급된 토큰을

auth에서 Bearer Token을 선택하고 토큰을 넣어 요청을 보내게 되면 위처럼 제대로 실행되는 것을 알 수 있다.

토큰이 손상되었을 경우에도 이전 포스팅에서 처리한대로 제대로 처리되는 것을 확인한다.

 

참고

본 포스팅은 아래 강의를 참고하여 작성하였습니다.

https://inf.run/acEm

 

[지금 무료] [초급] 찍어먹자! 코틀린과 Spring Security + JWT로 회원가입 만들기 강의 | 김대디 - 인프

김대디 | Spring Security와 JWT 실습을 통해 권한 관리를 쉽고 간단하게 찍어먹어 보세요., 떠오르는 백엔드 강자 코프링, 회원가입 & 권한 관리 실습으로 확실하게!  Kotlin + Spring Boot찍먹하며 배우는

www.inflearn.com

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'Spring' 카테고리의 다른 글
  • [SpringBoot] 스프링부트 프로젝트 시작하기 - 5. Security 설정하고 로그인 확인하기
  • [SpringBoot] 스프링부트 프로젝트 시작하기 - 4. JWT 토큰 생성하기
  • [SpringBoot] 스프링부트 프로젝트 시작하기 - 3. Validation 이용하여 예외처리하기
  • [SpringBoot] 스프링부트 프로젝트 시작하기 - 2. JPA 활용하여 회원가입 만들기
LIRI
LIRI
  • LIRI
    기록
    LIRI
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • 바이브코딩 (1)
      • React (3)
      • CS (0)
      • 알고리즘 (57)
        • 개념 (2)
        • 문제풀이 (54)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    JWT
    BOJ
    lv3
    프로그래머스
    백준
    커서ai
    느좋코딩
    Spring
    LIS
    싸피
    알고리즘
    알고리즘 문제풀이
    springboot
    SSAFY
    그리디
    바이브코딩
    dfs
    Security
    최장증가부분수열
    SSAFY 9기
    ssafy 합격 후기
    BFS
    Java
    너비우선탐색
    리액트
    LV2
    pccp모의고사
    비트마스킹
    Springsecurity
    dp
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
LIRI
[SpringBoot] 스프링부트 프로젝트 시작하기 - 6. 토큰 이용하여 인가된 사용자 걸러내기
상단으로

티스토리툴바