Spring security
-
앞선 spring security에서는 memory 기반에 사용자 정보를 추가하고 동작시켜보았다. 하지만 일반 실무에서 그럴리는 거의 없을 것이다. 이번 포스트에서는 JDBC 기반으로 사용자를 관리하는 방법에 대해 알아보자. AuthenticationManager AuthenticationManager와 DaoAuthenticationManager인증과 관련된 처리는 AuthenticationManager 인터페이스가 담당하는데 그 구현체는 ProviderManager이다. 말 그대로 인증 방식을 제공하는 Provider들(AuthenticationProvider)을 관리하는 객체이다. Provider는 상황에 따라 여러가지 형태가 가능하므로 ProviderManager는 Authentication..
08. JDBC를 이용한 인증앞선 spring security에서는 memory 기반에 사용자 정보를 추가하고 동작시켜보았다. 하지만 일반 실무에서 그럴리는 거의 없을 것이다. 이번 포스트에서는 JDBC 기반으로 사용자를 관리하는 방법에 대해 알아보자. AuthenticationManager AuthenticationManager와 DaoAuthenticationManager인증과 관련된 처리는 AuthenticationManager 인터페이스가 담당하는데 그 구현체는 ProviderManager이다. 말 그대로 인증 방식을 제공하는 Provider들(AuthenticationProvider)을 관리하는 객체이다. Provider는 상황에 따라 여러가지 형태가 가능하므로 ProviderManager는 Authentication..
2022.11.22 -
이번 포스트에서는 로그인/로그아웃 과정을 커스터마이징 해보자.로그인/로그아웃 과정 Form Login 절차인증되지 않은 사용자가 secured resource인 /private 를 요청한다.Spring Security의 AuthenticationFilter는 AccessDeniedException을 던져서 요청 거부를 나타낸다.예외를 ExceptionTranslationFilter가 받아서 AuthenticationEntryPoint 중 하나인 LoginUrlAuthenticationEntryPoint를 이용해 /login으로 redirection 보낸다.브라우저가 /login을 요청하면LoginController가 login.html 을 응답한다. 따라서 프로그래머는 get 방식의 /login을 처리할..
07. 로그인/로그아웃 커스터마이징이번 포스트에서는 로그인/로그아웃 과정을 커스터마이징 해보자.로그인/로그아웃 과정 Form Login 절차인증되지 않은 사용자가 secured resource인 /private 를 요청한다.Spring Security의 AuthenticationFilter는 AccessDeniedException을 던져서 요청 거부를 나타낸다.예외를 ExceptionTranslationFilter가 받아서 AuthenticationEntryPoint 중 하나인 LoginUrlAuthenticationEntryPoint를 이용해 /login으로 redirection 보낸다.브라우저가 /login을 요청하면LoginController가 login.html 을 응답한다. 따라서 프로그래머는 get 방식의 /login을 처리할..
2022.11.18 -
이제 본격적으로 Spring Security를 사용해보자. 사용자 관리와 UserDetailService PasswordEncoderSpring Security의 PasswordEncoder는 비밀번호가 안전하게 저장되도록 단방향 변환을 수행하는데 사용된다.Spring Security의 기본 PasswordEncoder로 4.X 까지는 NoOpPasswordEncoder(비밀번호를 암호화 하지 않아도 괜찮음)가 사용되다가 5.X 부터는 BCryptPasswordEncoder(BCrypt 해시 함수로 해싱)가 사용된다.하지만 기존의 애플리케이션들이 한번에 다 바뀔 수 없기 때문에 중간에 DelegatingPasswordEncoder를 도입하게 되었다. 그리고 가장 쉽게 처리하는 방식은 PasswordE..
06. 사용자 및 경로 관리이제 본격적으로 Spring Security를 사용해보자. 사용자 관리와 UserDetailService PasswordEncoderSpring Security의 PasswordEncoder는 비밀번호가 안전하게 저장되도록 단방향 변환을 수행하는데 사용된다.Spring Security의 기본 PasswordEncoder로 4.X 까지는 NoOpPasswordEncoder(비밀번호를 암호화 하지 않아도 괜찮음)가 사용되다가 5.X 부터는 BCryptPasswordEncoder(BCrypt 해시 함수로 해싱)가 사용된다.하지만 기존의 애플리케이션들이 한번에 다 바뀔 수 없기 때문에 중간에 DelegatingPasswordEncoder를 도입하게 되었다. 그리고 가장 쉽게 처리하는 방식은 PasswordE..
2022.11.18 -
이번 포스트에서는 기존의 예제에 refresh token 개념을 추가해보자. Server Side 추가/수정 먼저 Server Side에서 추가 또는 수정해야 할 내용들이다. JwtUtil refresh token을 발행하기 위한 메서드를 추가한다. /** * Refresh 토큰을 생성한다 * 이때는 인증을 위한 정보는 유지하지 않고 유효기간을 auth-token의 5배로 잡았다. * @return */ public String createRefreshToken() { return create(null, "refreshToken", expireMin * 5); } UserService 로그인 시 auth-token과 함께 refresh-token도 생성한다. 이 정보는 사용자 계정과 함께 DB에 저장되는..
JWT를 이용한 인증 처리 6. Refresh Token 구현이번 포스트에서는 기존의 예제에 refresh token 개념을 추가해보자. Server Side 추가/수정 먼저 Server Side에서 추가 또는 수정해야 할 내용들이다. JwtUtil refresh token을 발행하기 위한 메서드를 추가한다. /** * Refresh 토큰을 생성한다 * 이때는 인증을 위한 정보는 유지하지 않고 유효기간을 auth-token의 5배로 잡았다. * @return */ public String createRefreshToken() { return create(null, "refreshToken", expireMin * 5); } UserService 로그인 시 auth-token과 함께 refresh-token도 생성한다. 이 정보는 사용자 계정과 함께 DB에 저장되는..
2022.05.05 -
이제까지 테스트를 통해서 검증했지만 그래도 클라이언트를 붙여봐야 웬지 동작이 잘 이해될것 같아서 화면을 만들고 동작을 테스트 해보자. 기억해줄 내용은 로그인 성공 후 @ResponseBody를 통해서 서버는 클라이언트에게 정보를 내려보내주고 클라이언트는 서버로 정보 요청 시 header에 jwt-auth-token이라는 이름으로 토큰을 전달해준다는 점이다. 클라이언트는 전달받은 토큰을 session storage에 저장해두자. 클라이언트 작성 화면 구성 간단한 화면 구성이고 ajax를 사용하기 위해서는 axios가 사용 되었다. jwt test 토큰 유효기간 상태 정보 이제 javascript 영역에서 이벤트를 처리하면서 ajax 요청을 처리해보자. javascript 처리 먼저 화면의 요소들을 설정하기..
JWT를 이용한 인증 처리 4이제까지 테스트를 통해서 검증했지만 그래도 클라이언트를 붙여봐야 웬지 동작이 잘 이해될것 같아서 화면을 만들고 동작을 테스트 해보자. 기억해줄 내용은 로그인 성공 후 @ResponseBody를 통해서 서버는 클라이언트에게 정보를 내려보내주고 클라이언트는 서버로 정보 요청 시 header에 jwt-auth-token이라는 이름으로 토큰을 전달해준다는 점이다. 클라이언트는 전달받은 토큰을 session storage에 저장해두자. 클라이언트 작성 화면 구성 간단한 화면 구성이고 ajax를 사용하기 위해서는 axios가 사용 되었다. jwt test 토큰 유효기간 상태 정보 이제 javascript 영역에서 이벤트를 처리하면서 ajax 요청을 처리해보자. javascript 처리 먼저 화면의 요소들을 설정하기..
2022.04.28 -
다음으로 JwtUtil을 사용할 UserService와 JwtInterceptor를 만들어보자.이번에 작성해볼 예제의 전체적인 동작은 아래와 같다.UserService에서는 인증된 사용자를 대상으로 /api/info를 통해서 어떤 정보를 반환하는 서비스를 한다. 이때 인증 체크를 위해서는 JwtInterceptor를 거치게 처리했다.각 단계별 동작은 아래와 같다./jwt/login을 호출한다. 이때는 인증이 필요 없으므로 Interceptor를 거치지 않는다.UserService를 통해서 로그인 가능한 사용자인지 확인한다.로그인 가능하다면 JWTUtil을 통해 토큰을 생성하고 반환한다.브라우저는 전달받은 토큰을 로컬의 브라우저에 저장한다./api/info를 호출하면서 토큰을 전달한다. 이 api는 인증이..
JWT를 이용한 인증 처리 3다음으로 JwtUtil을 사용할 UserService와 JwtInterceptor를 만들어보자.이번에 작성해볼 예제의 전체적인 동작은 아래와 같다.UserService에서는 인증된 사용자를 대상으로 /api/info를 통해서 어떤 정보를 반환하는 서비스를 한다. 이때 인증 체크를 위해서는 JwtInterceptor를 거치게 처리했다.각 단계별 동작은 아래와 같다./jwt/login을 호출한다. 이때는 인증이 필요 없으므로 Interceptor를 거치지 않는다.UserService를 통해서 로그인 가능한 사용자인지 확인한다.로그인 가능하다면 JWTUtil을 통해 토큰을 생성하고 반환한다.브라우저는 전달받은 토큰을 로컬의 브라우저에 저장한다./api/info를 호출하면서 토큰을 전달한다. 이 api는 인증이..
2022.04.28 -
이번 포스트에서는 전반적인 프로젝트 구성 및 환경 설정을 해보자. 문제링크 프로젝트 생성다음과 같이 프로젝트를 생성해보자.주요 특징은 Java17 기반의 Maven Project이고 Spring Boot DevTools, Lombok, Spring Web, Thymeleaf, Spring Security, H2 Database, Spring Data JPA를 사용한다. application.yml 편집spring data jpa와 h2, mustache 사용을 위한 yml 파일을 다음과 같이 작성해보자.logging: level: root: info pattern: console: '%clr(%d{HH:mm:ss} [%-5p] [%c{20}.%M.%L] %m%n)'spring: outpu..
05. 프로젝트 구성과 초기 동작이번 포스트에서는 전반적인 프로젝트 구성 및 환경 설정을 해보자. 문제링크 프로젝트 생성다음과 같이 프로젝트를 생성해보자.주요 특징은 Java17 기반의 Maven Project이고 Spring Boot DevTools, Lombok, Spring Web, Thymeleaf, Spring Security, H2 Database, Spring Data JPA를 사용한다. application.yml 편집spring data jpa와 h2, mustache 사용을 위한 yml 파일을 다음과 같이 작성해보자.logging: level: root: info pattern: console: '%clr(%d{HH:mm:ss} [%-5p] [%c{20}.%M.%L] %m%n)'spring: outpu..
2020.08.20 -
이번 포스트에서는 Authorization Architecture에 대해 살펴보자. Authorization Architecture 권한(Authorization)사용자가 인증되면 Authorization 객체가 생성된다. 이 객체는 사용자가 가진 권한을 나타내는 GrantedAuthority 목록을 포함한다. GrantedAuthority는 사용자(Principal)가 특정 작업을 수행할 수 있는지를 반환하는 역할을 한다.GrantedAuthority 인터페이스의 getAuthority()는 권한을 문자열로 반환한다. 기본적으로 role 기반의 권한 부여 규칙에서는 접두사로 "ROLE_"를 붙인다. 따라서 getAuthority()는 "ROLE_USER", "ROLE_ADMIN" 등의 형태로 권한을..
04. Servlet Authorization Architecture이번 포스트에서는 Authorization Architecture에 대해 살펴보자. Authorization Architecture 권한(Authorization)사용자가 인증되면 Authorization 객체가 생성된다. 이 객체는 사용자가 가진 권한을 나타내는 GrantedAuthority 목록을 포함한다. GrantedAuthority는 사용자(Principal)가 특정 작업을 수행할 수 있는지를 반환하는 역할을 한다.GrantedAuthority 인터페이스의 getAuthority()는 권한을 문자열로 반환한다. 기본적으로 role 기반의 권한 부여 규칙에서는 접두사로 "ROLE_"를 붙인다. 따라서 getAuthority()는 "ROLE_USER", "ROLE_ADMIN" 등의 형태로 권한을..
2020.07.16