Spring

[Spring Security] 권한 인증 관련 에러(401, 403) CustomException처리로 보여주기

2023. 11. 15. 17:38
목차
  1. 문제 상황
  2. 해결 방법
  3. 결과
  4. 401 에러 CustomException
  5. 403 에러 CustomException

 

하고싶었던 개인프로젝트를 진행하면서 정리하고싶고 마주한 어려움도 많았지만 우선 권한 인증 에러부분 같은 경우 이전에도 CustomException으로 동일하게 처리하고싶었기 때문에 이것 먼저 정리해둔다.

 

문제 상황

-> 이미 인텔리제이 종료후 유효하지않은 token 값으로 접근한 경우

 

-> 사용자 없을 때 CustomException 처리 문구

 

문제 > 로그인이 안된 상태인데 401에러가 아닌 403에러를 뱉어내고, 내내 CustomException으로 동일성을 주었던것이

권한 인증에 관련해서 일관성이 없어서 마음에 안들었다.

 

해결 방법

 

 

JwtAccessDeniedHandler

@Component
public class JwtAccessDeniedHandler implements AccessDeniedHandler {
  private final ObjectMapper objectMapper = new ObjectMapper();

  @Override
  public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
    ErrorResponse errorResponse;
    
    // 필요한 권한이 없이 접근하려 할때 403
    response.setStatus(HttpServletResponse.SC_FORBIDDEN);

    errorResponse = ErrorResponse.builder()
        .httpCode(403)
        .errorCode(NOT_MATCH_AUTHORIZATION)
        .ErrorMessage(NOT_MATCH_AUTHORIZATION.getDescription())
        .build();

    response.setContentType("application/json;charset=UTF-8");
    response.getWriter().write(objectMapper.writeValueAsString(errorResponse));
    response.flushBuffer();
  }
}

 

JwtAuthenticationEntryPoint

@Component
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
  private final ObjectMapper objectMapper = new ObjectMapper();

  @Override
  public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
    ErrorResponse errorResponse;

    // 유효한 자격증명을 제공하지 않고 접근하려 할때 401
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

    errorResponse = ErrorResponse.builder()
        .httpCode(401)
        .errorCode(UN_AUTHORIZATION)
        .ErrorMessage(UN_AUTHORIZATION.getDescription())
        .build();

    response.setContentType("application/json;charset=UTF-8");
    response.getWriter().write(objectMapper.writeValueAsString(errorResponse));
    response.flushBuffer();

  }
}

 

각 인증이 없었을 경우, 권한이 없었을 경우를 처리할 수 있도록 Component 클래스를 만든다.

 

그리고 나서 SecurityConfig에 다음과 같이 exceptionHandeling에 처리하도록 설정하면된다.

 

SecurityConfig

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        
...
            .and()
            .exceptionHandling()
            .authenticationEntryPoint(jwtAuthenticationEntryPoint)
            .accessDeniedHandler(jwtAccessDeniedHandler)

....
    }

 

결과

401 에러 CustomException

1. 401 에러> 로그인 후 로그아웃 or 인텔리제이 종료 후 기존 token값으로 접근하려는 경우

-> 로그아웃된 User 토큰값으로 User 접근 페이지 접근한 경우

 

-> 로그아웃된 User 토큰값으로 Admin 접근 페이지 접근한 경우

 

-> accessToken 유효기간이 지난 후 접근하려는 경우

403 에러 CustomException

2. 403 에러 > 로그인 후 발급받은 token이 User(일반사용자)인데 Admin(카페관계자) 페이지에 접근하려는 경우

 

반응형

'Spring' 카테고리의 다른 글

org.hibernate.PersistentObjectException: detached entity passed to persist 에러  (0) 2023.11.20
window 환경에서 sdkman 설치하기  (0) 2023.09.05
spring boot version 3.x.x 사용시 swagger 사용이 불가한 상황 생김  (0) 2023.08.23
  1. 문제 상황
  2. 해결 방법
  3. 결과
  4. 401 에러 CustomException
  5. 403 에러 CustomException
'Spring' 카테고리의 다른 글
  • org.hibernate.PersistentObjectException: detached entity passed to persist 에러
  • window 환경에서 sdkman 설치하기
  • spring boot version 3.x.x 사용시 swagger 사용이 불가한 상황 생김
three von
three von
어려워 보이는 프로그래밍 언어를 쉽게 정복하는 블로그
LangEASY : 프로그래밍 언어를 쉽게 정복하는 공간어려워 보이는 프로그래밍 언어를 쉽게 정복하는 블로그
반응형
three von
LangEASY : 프로그래밍 언어를 쉽게 정복하는 공간
three von
전체
오늘
어제
  • 분류 전체보기 (89)
    • BackEnd (5)
    • JAVA (5)
      • 기초개념 (5)
    • 자료구조 & 알고리즘 (7)
      • 기초수학 (0)
      • 선형 자료구조 (4)
      • 비선형 자료구조 (1)
      • 알고리즘 (1)
    • CS (18)
      • 컴퓨터구조 (0)
      • 운영체제 (3)
      • 시스템 소프트웨어 (0)
      • 네트워크 (4)
      • 디자인패턴 (10)
    • 데이터베이스 (4)
    • Spring (4)
    • Project (2)
      • 팀프로젝트 (1)
      • 토이프로젝트 (1)
    • 회고 (0)
    • Git&Github (8)
    • IntelliJ (5)
    • 코테 (16)
      • 프로그래머스 (10)
      • 백준 (6)
    • BookStudy (12)
      • 스프링 부트 핵심 가이드 (12)
    • C++ (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백엔드 스쿨
  • 제로베이스
  • 백엔드스쿨
  • 제로베이스백엔드스쿨미니과제
  • github
  • vi/vim에디터사용
  • heap 자료구조
  • 제로베이스백엔드스쿨
  • github이슈관리
  • spring
  • InteliJ에서 gitbash사용
  • 깃 이슈관리
  • IntelliJ 자동화
  • Java
  • windowcmd창
  • 코테
  • 개발자
  • 백엔드
  • 윈도우에서 리눅스 명령어
  • 명령어변환
  • 백엔드공부
  • java heap 자료구조
  • 리눅스 명령어 윈도우 cmd창에서 가능
  • LiveTemplate사용
  • githubTest
  • 인텔리제이에서 gitbash로 vi vim 에디터 사용하는법
  • 자바 자바해시맵
  • vi/vim
  • 자바 선형자료구조
  • 자바 자료구조 힙

최근 댓글

최근 글

hELLO · Designed By 정상우.
three von
[Spring Security] 권한 인증 관련 에러(401, 403) CustomException처리로 보여주기
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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