Authorization이란?Authorization은 사용자 인증(Authentication)이 완료된 후 해당 사용자가 특정 리소스나 기능에 접근할 권한이 있는지 확인하는 과정이다. 예를 들어 관리자만 특정 API를 호출 가능하게 하거나, 사용자가 다른 유저가 아닌 자신의 데이터만 접근할 수 있다거나 하는 리소스 보호를 할 수 있다.또 사용자의 역할. 특정 클랜의 멤버와 관리자는 할 수 있는 역할의 범위가 다를 것이다. 이런 컨셉 또한 authorization으로 처리할 수 있다.해당 포스팅에서는 Spring Security와 JWT를 이용하여 Authorization 필터를 구현하고 전체적인 request 처리 흐름을 살펴보겠다. JWT 기반 Authorization 필터 구현JWT를 활용한 aut..
Servlet Authentication 구조JWT를 이용한 사용자 인증을 어떻게 코드로 구현하는지에 앞서, Spring Security에서 Servlet Authentication이 어떻게 돌아가는지 핵심적으로 알아보자.먼저 Spring Security Authentication 구조를 이루고 있는 요소들은 다음과 같다. SecurityContextHolder - SecurityContextHolder는 인증된 사용자에 대한 세부 정보를 저장하는 곳이다. SecurityContext - SecurityContextHolder에서 얻을 수 있으며 사용자의 인증 상태와 세부 정보를 확인할 수 있다.Authentication - SecurityContext에 있는 Authentication은 인증된 유저에..
Spring Security를 사용하는 이유Spring Security는 Spring으로 구현한 어플리케이션에서 인증(Authentication)과 권한 부여(Authorization)을 관리하기 위한 프레임워크이다. 웹 어플리케이션과 RESTful API, MicroService 등 다양한 형태의 어플리케이션에서 적용 가능한 보안 설정을 지원한다. Spring Security의 주요 기능은 다음과 같다.인증(Authentication): 사용자의 신원을 확인.권한 부여(Authorization): 사용자가 특정 리소스나 기능에 접근할 수 있는지 권한 확인.CSRF 보호: Cross-Site Request Forgery 방지.세션 관리: 로그인/로그아웃과 관련된 세션 제어보안 헤더: XSS, Clickj..
JWT 토큰의 구조JWT(Jason Web Token)은 인증(Authentication)과 권한 부여(Authorization)를 안전하고 효율적으로 처리하기 위해 사용된다.백엔드 개발자가 사용자 인증을 구현해야 할 때 요청을 보내는 유저가 "누구인지" 확인하고, "할 수 있는 일"을 판단 해야한다.이 때 JWT 토큰을 이용하여 유저의 필요한 정보를 저장하여 인증/권한을 확인할 수 있다. 먼저 JWT 토큰의 구조는 다음과 같다. 마침표, 즉 '.' 문자를 기준으로 Header, Payload, Signature를 구분하여 가진다... Header는 JWT의 메타데이터를 포함한다.일반적으로 토큰의 타입, 서명 알고리즘의 종류를 포함한다.{ "alg": "HS256", "typ": "JWT"} Payl..
Custom Exception과 Exception Handler가 필요한 이유Custom Exception은 어플리케이션에서 발생하는 다양한 에러를 의미있게 정의하기 위해 사용한다.표준 exception class, 예를 들어 IllegalArgumentException, NullPointerException 같이 일반적인 에러를 표현해주는 exception들이 이미 존재하지만, 우리가 개발하는 어플리케이션의 비즈니스 로직에 맞는 구체적인 정보를 전달하기에는 부족하다.따라서 Custom Exception을 통해 명확하고 구체적인 에러 메시지와 데이터를 제공하는 것이 바람직하다. Exception handler는 exception 발생에 따른 후처리를 어떻게 할 것인지에 대한 구현체이다.동일한 유형의 ex..
AOP란?AOP(Aspect-Oriented Porgramming)은 관점 지향 프로그래밍이라고 한다. 어플리케이션의 공통 관심사를 모듈화 하여 코드의 중복성을 줄이고 유지보수를 용이하게 하는 프로그래밍 패러다임이다. Spring AOP는 프레임워크에서 제공하는 구현체로 런타임 시점에 동적으로 Proxy를 생성하여 메서드 호출 전후에 특정 로직을 추가할 수 있다. 로깅 시스템에서 AOP를 사용하는 이유는 다음과 같다.로깅은 비즈니스 로직과는 독립적이지만 공통 관심사이다. AOP를 통해 이를 비즈니스 코드와 분리하여 관리할 수 있다.여러 클래스와 메소드에서 발생하는 로깅을 하나의 코드에서 처리할 수 있다.하나의 코드에서 관리하기 때문에 유지보수와 수정, 확장이 용이하다.Log4j2 설정 방법 및 파일 구성..
개발 사례보통 entity class를 선언할 때 다음과 같이 @Id, @GeneratedValue를 사용하여 자동적으로 Id를 생성한다.@Entity@Table(name = "user")@Builderpublic class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "nickname", nullable = false, unique = true, length = 15) @NotBlank(message = "Nickname is required") @Size(min = 2, max = 15) @Pattern(regexp = "^[A-Za..
만약 서비스단에서 복잡한 비즈니스 로직을 구현해야 하고, 그 반환값으로 또한 복잡한 구조의 DTO가 만들어진다고 해보자.@Getter@Setter@NoArgsConstructor@AllArgsConstructorpublic class UserInterestSingleDto { private Long creatorId; private String creator; private String clan; private StockDto stockInfo; private LocalDate capturedAt; private LocalDate closedAt; private BigDecimal capturedPrice; private BigDecimal targetPrice..