# Back-End

    @Secured, @PreAuthorized를 이용한 메소드 수준의 권한 적용

    Spring Security의 메소드 수준의 API 권한 관리 API 경로에 권한을 적용하여 관리하다 보면, 같은 기능을 여러 권한에서 사용할 수 있게 중복으로 코드를 작성하는 문제가 발생합니다. 예를 들면 사용자가 주문정보를 조회하는 것과 어드민이 한 사용자의 게임을 조회하는 것 등이 있습니다. API 경로에 대해 권한을 관리하는 것이 아닌 메소드 수준에서 권한을 설정하는 방법을 알아봅니다. @Secured와 @PreAuthorize 어노테이션 두 어노테이션 모두 Spring Security의 어노테이션으로, 메소드 수준의 보안을 제공하는 데 사용됩니다. 동일한 기능을 제공하지만 약간의 차이가 있습니다. @PreAuthroize는 Spring EL(표현식)을 사용할 수 있고, AND나 OR 같은 표현식..

    Role Enum 클래스를 이용한 인가

    Role Enum이란 @Getter @RequiredArgsConstructor public enum Role { TYPE1("USER1"), TYPE2("USER2"), TYPE3("ADMIN") } Role이란 시스템을 사용하는 사용자의 역할을 말한다. 그 자체만으로 권한으로 사용할 수 있고 Depth를 한단계 더 두면 각 역할의 권한을 따로 설정할 수도 있다. (Ex : USER1, USER2는 읽기 권한, ADMIN은 읽기/쓰기 권한) Role Enum의 목적 시스템 사용자의 각각 역할에 대해서 어떤 권한을 사용할 지 관리하는 것을 용이하게 함 Spring Security에서 Role을 통해 인증하는 과정 @Override protected void configure(HttpSecurity htt..

    Spring Security란?

    Spring Security란? Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 Spring 하위 프레임워크 개발자가 보안 관련 로직을 작성하는 것을 대폭 줄여주는 장점을 갖고 있다. Spring Security 구성요소 1. HTTP 요청 수신, Authentication Filter 통과 Spring Security는 여러개의 연결된 필터(필터체인)를 갖고 있는데, Request는 인증, 인가를 허락받기 위해 이 필터체인을 통과하게 되고, 해당 요청과 관련된 인증 필터를 찾을 때까지 통과한다. ex) HTTP Basic 인증 요청은 BasicAuthenticationFilter에 도달할 때까지 필터 체인을 통과한다. ex) HTTP Digest 인증 요청은 DigestAut..

    JWT란?

    JWT(JSON Web Token)란? JWT란 JSON 포맷을 이용해 사용자에 대한 속성을 저장하는 Claim 기반의 웹 토큰이다. 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안전하게 전달한다. JWT의 구조 JWT는 헤더, 내용, 서명 순서대로 세 파트로 구성된다. 1. 헤더(Header) 헤더는 토큰의 타입, 해싱 알고리즘으로 구성된다. 토큰의 타입 : JWT 해싱 알고리즘 : HMAC SHA256 혹은 RSA (토큰을 검증할 때 Signature 부분에서 사용된다.) { "typ": "JWT", "alg": "HS256" } 2. 내용(Payload) 토큰에 사용자가 담고자 하는 정보를 담는 곳 토큰에서 사용할 정보의 조각들인 Claim이 담긴다. 토큰에는 여러 개의 ..

    인증 방식 비교(서버 기반 인증, 토큰 기반 인증)

    서버 기반 인증(Session, Cookie) 서버 측에서 사용자들의 정보를 기억하기 위해 세션을 유지해야 하고, 세션을 메모리, 디스크, 데이터베이스 등을 통해 관리한다. 클라이언트로부터 요청을 받으면 클라이언트의 상태 정보를 저장하여 유지해야 하므로 Stateful한 구조를 가진다. [ 인증 방식 ] 사용자가 로그인 시 올바른 사용자임을 확인하고, 고유한 세션 ID 값을 부여해 세션 저장소에 저장하고 클라이언트에게 발급해준다. 클라이언트는 서버에서 해당 세션 ID를 받아 쿠키에 저장하고, 인증이 필요한 요청을 할 때 마다 쿠키를 HTTP 헤더에 담아 전송한다. 서버에서는 세션 ID를 받아 세션 저장소와 비교해 올바른 요청인지 확인한다. 인증이 완료되고 서버는 요청에 응답한다. [ 장점 ] 중요한 정보..

    Filter, Interceptor, AOP (필터, 인터셉터, AOP)

    Filter, Interceptor, AOP Filter, Interceptor, AOP 모두 무슨 행동을 하기전에 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 때 사용된다. 요청의 흐름에 따라 필터, 인터셉터, AOP의 차이점에 대해 알아봅니다. 전체 흐름, 차이점 요청이 들어왔을 때 진행되는 순서는 Filter → Interceptor → AOP → Interceptor → Filter의 순으로 거치게 됩니다. Filter의 역할 Filter는 J2EE표준 스펙 기능으로, Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. Web Application에 등록한다. 스프링 컨텍스트 외부에 존재하여 스프링과 ..

    [Test] Spring Layer별 테스트 작성

    Spring Boot 레이어별 테스트 작성 가이드 Domain JUnit, AssertJ 등 테스트 편의 도구를 이용해서 테스트한다. Repository 인메모리 DB를 사용하고, JPA 관련 설정만 불러오는 @DataJpaTest를 이용해서 Repository의 동작(저장 및 조회)에 대해 테스트한다. 저장을 위한 JPA 연관 관계가 적절히 구성되었는지, Repository 메소드가 제대로 구현되었는지 확인하는 것을 목적으로 한다. JPA 관련 어노테이션 없이 코드를 작성해서 저장에 실패하는 테스트 코드를 먼저 작성하고, JPA 규칙에 맞는 어노테이션을 추가해서 테스트 코드를 통과시킨다. 기본적으로 인메모리 DB를 사용하나 테스트에 사용할 DB를 지정할 수 있다. Service 트랜잭션을 관리하는 것이..

    [Test] Spring Boot 테스트 클래스 정의 어노테이션

    Test의 종류 @SpringBootTest 통합 테스트 실제 App과 동일한 환경에서 테스트 @WebMvcTest 컨트롤러 테스트 웹상에서의 요청과 응답에 대한 테스트 @DataJpaTest JPA 관련된 설정을 로드하여 테스트 기본적으로 인메모리 DB로 테스트 테스트가 끝날 때마다 자동으로 테스트에 사용한 데이터를 롤백 @RestClientTest Rest 통신의 JSON 형식이 예상대로 응답을 반환하는지 등을 테스트

    [Test] JUnit5를 이용한 테스트 코드 작성

    JUnit5란? JVM에서 사용하는 테스트 프레임워크 테스트 개발을 위한 API 제공 Spring Boot 2.2.X 버전에서는 기본적으로 제공 (spring-boot-starter-test) JUnit4, JUnit5의 차이점 Spring 기본 제공 여부 구성된 모듈 사용하는 어노테이션 JUnit5는 Java 8부터 이용 가능 JUnit5 주요 어노테이션 @Test 테스트 메소드임을 선언 @DisplayName 테스트 메소드의 이름 표기 @BeforeAll static으로 작성하고, 테스트 class가 실행되기 전에 실행되는 곳 @BeforeEach 각 테스트 메소드가 실행되기전 실행 @AfterEach 각 테스트 메소드가 실행된 후 실행 @AfterAll static으로 작성하고, 테스트 class가..

    H2 console 세팅 & 접속

    1. yaml 설정 # h2 yaml spring: datasource: hikari.jdbc-url: jdbc:h2:mem://localhost/~/testdb;MODE=MYSQL jpa: hibernate: direct: org.hibernate.dialect.MySQL5InnoDBDialect ddl-auto: create h2: console: enabled: true 2. 웹 콘솔 접속 http://localhost:8080/h2-console 3. JDBC URL 수정 jdbc:h2:mem://localhost/~/testdb;MODE=MYSQL 복사 후 JDBC URL에 붙여넣기 4. 접속 Connect 버튼을 눌러 접속한다.