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

2024. 6. 28. 23:39·Spring
728x90
반응형

버전

  • 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
  • 전체
    오늘
    어제
    • 분류 전체보기 (38)
      • 블로그 꾸미기 (0)
      • Spring (6)
      • React (3)
      • CS (0)
      • 알고리즘 (22)
        • 개념 (2)
        • 문제풀이 (19)
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    너비우선탐색
    LIS
    Java
    Security
    springboot
    최장증가부분수열
    pccp모의고사
    불 끄기
    싸피
    BFS
    백준
    프로그래머스
    JWT
    LV2
    골드1
    비트마스킹
    SSAFY 스터디
    알고리즘
    Spring
    SSAFY 9기
    BOJ
    그리디
    dp
    ssafy 합격 후기
    도대체왜
    lv3
    SSAFY
    dfs
    리액트
    Springsecurity
  • 최근 댓글

  • 최근 글

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

티스토리툴바