본문 바로가기

Back-End/Spring-MVC

(14)
AOP를 활용한 권한 검증 (feat. 커스텀 어노테이션) 1. 커스텀 어노테이션 소개AOP와 함께 사용할 @AuthCheck 어노테이션은 메서드 수준에서 권한을 정의한다. 이 어노테이션에 필요한 권한을 설정하고, AOP를 통해 권한 검증 로직을 실행한다.String[] value() : 메서드에 접근 가능한 권한을 배열로 정의한다. 배열로 정의한 이유 : OWNER OR CUSTOMER 처럼 각각 접근 가능한 메서드가 따로 있지만 OWNER AND CUSTOMER 처럼 공통으로 접근 가능한 페이지가 있기 때문이다. 2. 커스텀 어노테이션을 활용하여 AOP 권한 검증클래스 선언부@Slf4j : 로깅 기능을 제공하는 Lombok 어노테이션, log 객체를 자동으로 생성@Component : Spring Bean으로 등록. Spring 컨텍스트에서 AOP를 사용할 ..
JWT 기반 인증/인가 흐름에서 AOP와 필터(URI기반) JWT에 대해서는 저번 시간에 많이 설명했으니 이 글에서는 간단히 설명만 하고 넘어가겠다.1. JWT 기반 인증/인가 개념JWT는 사용자 정보를 안전하게 클라이언트와 서버 간에 교환하기 위해 사용. 클라이언트는 서버로 요청을 보낼 때 JWT를 포함하고, 서버는 JWT를 검증하여 사용자를 인증하거나 권한을 확인한다.JWT 구조Header : 토큰 타입(JWT)과 서명 알고리즘 정보Payload : 사용자 정보(ex: userId, role 등)Signature : 데이터 위조 방지용 서명2. 필터와 AOP의 역할1) 필터의 역할 : 인증필터는 요청(Request)이 들어올 때 가장 먼저 실행된다. 주로 JWT 토큰을 검증하여 사용자를 인증하는 데 사용된다.필터의 주요 작업HTTP 요청 헤더에서 JWT 토큰..
JWT 기반 인증 및 역할별 API 설계와 구현 : 관리자와 사용자 권한 처리 JWT를 사용해 초기 관리자를 설정하고 이를 통해 인증과 권한 관리를 구현하는 법. 사용자와 관리자로 역할을 나누고, 역할에 따라 접근 가능한 API를 RESTful하게 설계 한다!!1. RESTful API 설계1. 관리자 전용 API - 모든 사용자 조회 - 특정 사용자 삭제2. 사용자 전용 API - 사용자 프로필 조회 - 일정 생성 및 삭제3. Public API - 회원가입 - 로그인관리자 전용 APIHTTP MethodURI설명권한GET /api/admin/users모든 사용자 조회ADMINGET /api/admin/users/{id}특정 사용자 조회ADMINDELETE /api/admin/users/{id}사용자 삭제ADMIN사용자 전용 APIHTTP MethodURI설..
JWT(Json Web Token) 1. JWT란?JWT는 사용자 인증과 정보 교환을 위해 사용되는 JSON 기반의 웹 토큰이다.구성Header : 토큰 타입과 서명 알고리즘 정보Payload : 사용자 정보와 클레임(데이터)JWT 클레임 : JWT의 Payload 부분에 포함된 데이터로, 토큰에 담고 싶은 정보를 저장claim("key", value)"key"는 클레임 이름value는 클레임의 값Signature : 토큰의 무결성을 보장하는 서명Header와 Payload를 비밀 키로 서명한 값JWT는 주로 클라이언트가 인증 서버에서 로그인 후 발급받아 이후 요청에 포함해 서버가 인증을 수행하도록 사용된다.2. JwtUtil 클래스JWT 관련 모든 핵심 로직을 처리하는 유틸리티 클래스BEARER_PREFIXJWT를 HTTP 헤더에 포함할..
스프링 글로벌 API 예외 처리와 @Valid 검증 예외 처리 @ControllerAdvice와 @ExceptionHandler란?스프링은 @ControllerAdvice와 @ExceptionHandler를 통해 특정 컨트롤러 또는 전역적으로 발생하는 예외를 처리할 수 있도록 지원한다. 이 접근법을 사용하면 코드 중복 없이 일관된 에러 응답을 클라이언트에게 반환할 수 있다.글로벌 API 예외 처리공통적으로 API 예외를 처리하는 예제1) 공통 응답 처리를 위한 응답 객체 생성2) InvalidPasswordException 정의3) GlobalExceptionHandler 클래스@ExceptionHandler(InvalidPasswordException.class)@ExceptionHandler는 지정된 예외가 발생했을 때 자동으로 해당 메서드가 호출되도록 설정하는..
Servlet Filter 서블릿 필터에 대해 알아보자공통 관심사란?애플리케이션에서 여러 로직이 공통적으로 신경 써야 하는 문제를 공통 관심사라고 한다.예를 들어:로그인하지 않은 비회원 유저가 상품 관리 페이지나 중요한 데이터에 접근하면 큰 문제가 발생할 수 있다.이를 방지하려면 어떻게 해야 할까?각 컨트롤러 메서드에 “로그인 여부 체크 로직”을 하나하나 작성해야 할 수도 있다.하지만 이 방법은 복잡하고, 중복 코드가 많아지고, 유지보수가 어렵다.만약 로그인 로직이 바뀌면 모든 코드를 수정해야 한다! 😱공통 관심사를 해결하는 방법: 서블릿 필터서블릿 필터는 이런 공통 관심사를 처리하기 위해 사용된다.특히 웹 애플리케이션에서 HTTP 요청과 응답을 가로채 처리하는 데 유용하다.서블릿 필터의 동작 흐름서블릿 필터 흐름HTTP 요청 ..
Cookie와 Session 쿠키쿠키가 생긴 이유가 바로 Stateless 때문이다. 왜냐하면 무상태이기 때문에 회원이 로그인을 하고 나서 페이지에 접근해도 연결이 끊어져서 서버는 로그인을 한 사람의 정보를 알지못한다!HTTP는 무상태(Stateless) 프로토콜이다.클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어진다.클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못한다.클라이언트와 서버는 서로 상태를 유지하지 않는다.그래서 그럼 모든 요청에 정보를 넘기면 되지 않냐? 하는데 이러면 해결될 수는 있지만 사이드 이팩트가 발생한다.모든 요청에 사용자 정보가 포함되도록 개발 해야한다. - 개발자가 너무 힘듦브라우저를 완전히 종료하고 다시 열면 어떻게 되는건가?이것때문에 쿠키가 탄생했는데웹 브라우저에서 유저가 POST ..
HTTP 요청 / 응답 조합 상황별 사용 공부 하다보면 느낄 것이다. 요청 받는 것과 응답 해주는 방식이 꽤 있는데 뭘 어케 쓰라는거지? 라고 그래서 한번 정리해봤다.1. HTML Form 데이터를 처리해야 할 때요청: @RequestParam(간단한 필드), @ModelAttribute(객체로 처리).응답: View 이름 반환.2. REST API 요청/응답요청: @RequestBody로 JSON 데이터를 처리.응답: @ResponseBody 또는 ResponseEntity로 JSON 반환.3. 상태 코드와 헤더를 제어해야 할 때응답: ResponseEntity.4. 정적 리소스 요청요청: 클라이언트에서 /static 디렉토리 경로로 요청.응답: Spring Boot가 자동으로 정적 파일 서빙. • @RequestParam: 단순 변수 • @..