본문 바로가기

스프링

(36)
[Spring] JWT, OAuth2.0, Email - Redis로 구현 시작하기에 앞서 우리는 이전에 JWT와 이메일 인증을 구현하는데 있어 각각의 토큰들을 DB에 저장하였다. JWT는 Member 엔티티에 RefreshToken이라는 속성을 만들고, 이메일 인증은 EmailAuth라는 엔티티를 만들었다. 물론 이러한 구현이 틀렸다는 부분은 아니지만 이러한 인증 토큰과 관련된 부분은 Redis를 많이 사용한다. Redis란 무엇이고 왜 Redis를 사용하는지 간단하게 살펴보자. Redis는 Remote Dictionary Server의 약자로서 Key-Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템이다. (NoSql이다.) In-Memory 기반의 데이터 처리 및 저장을 제공하여 속도가 빠르지만 서버가 꺼지면 모든..
[Spring] 이메일 인증 구현 시작하기에 앞서 우리는 어떤 웹 서비스를 이용하기 위해 로그인을 하지 않고 이용하기도 하지만 로그인을 하고 이용해야하는 부분도 존재한다. 그에 따라, 우리는 해당 서비스를 이용하고자 할 때 회원가입을 진행한다. 회원가입을 진행할 때, 우리는 이메일 인증을 마주하곤 한다. 이메일 인증을 하는 방법은 크게 두 가지로 나누어진다. 이메일을 입력하고 해당 이메일에 인증 코드를 보내고 인증 코드를 입력한 뒤 가입하고 이용하는 방식 회원가입을 모두 진행한 뒤, 이메일에 전송된 링크에 접속할 시 로그인 제한이 풀려 이용가능한 방식 이번 포스트에서는 후자의 방법을 구현해보려고 한다. 이번 구현은 이전에 JWT를 구현했던 부분을 이어서 진행한다. 다만, 이전에 했던 부분과 겹치는 내용이 존재하지 않기에 이번 내용만 다뤄..
[Security] Spring JWT 인증 With REST API(OAuth2.0 추가) (3) 시작하기에 앞서 지금까지 JWT를 활용하여 로그인을 구현해보았다. 하지만, 우리가 다양한 페이지들을 돌아다니다보면 구글 로그인, 네이버 로그인, 카카오 로그인 등 다양한 소셜 로그인이 존재하는 것을 볼 수 있다. 이는 전에 말했던 것처럼 OAuth2.0 방식으로 해당 리소스 서버에 인증을 받아 자원을 꺼내오는 식으로 진행된다. (OAuth 2.0, JWT (tistory.com)) 이를 실제로 구현해보려고 한다. 전체적인 로직을 구성하는데 있어서는 다음과 같이 구상해보았다. 먼저 프론트단에서 소셜 로그인을 진행하는 버튼을 구성하고 사용자는 해당 버튼을 클릭해 로그인을 진행한다. 그렇다면, 사용자는 Authentication Code를 발급받게되고 프론트에서는 이를 헤더에 실어 Server에 요청을 보낸다..
[Security] Spring JWT 인증 With REST API (2) 이전에 이어 이전에는 Spring Security를 이용해 JWT로 인증을 진행하는 방식을 구현해보았다. 이 방식은 다음과 같이 진행된다. 그런데 만약 토큰이 지정한 시간이 되어 만료된다면 어떻게 될까? 이전에 구현한 방식은 위와 같이 진행될 것이다. 기간이 만료된 토큰과 함께 /hello에 요청을 하지만 토큰 기간이 만료되어 요청이 반려될 것이다. 그에 따라, 사용자는 재로그인을 진행한다. 로그인이 성공했다면, 새로운 토큰을 발행하여 반환해주고 해당 토큰을 다시 포함시켜 서비스를 요청할 것이다. 로그인을 계속한다면 사용자에게 너무 불편한 느낌을 줄 수 있다. 이런 부분을 해결하기 위해 우리는 이렇게 생각해볼 수 있을 것이다. "Access Token의 만료 시간 자체를 늘리면 되지 않을까?" 어느 정도..
[Security] Spring JWT 인증 With REST API (1) 시작하기에 앞서 이전에 Spring Security Form Login을 통해 인증 처리를 구현해본바 있다. 이번에는 JWT를 이용해 인증 처리를 진행해보려고 한다. 이번엔 REST API를 활용해 간단한 로그인을 구현해보려고 한다. 요구사항 어떤 사용자는 어떤 페이지에 접근하기 위해서 로그인이 꼭 필요하다. 이를 위해 이전에 회원가입을 진행하고 로그인을 진행한 뒤에 해당 페이지에 접근한다. 로그인이 되어 있지 않을 시, 해당 페이지로의 접근은 불가하다. 개발 환경 Spring Boot : 2.5.6 Spring Security : 5.6.0 Gradle : 7.2 Mysql : 8.0 Entity 이번 요구사항에서는 단순 회원가입 후 로그인을 진행하는 것이기에 엔티티는 회원으로 간단하게 구성하였다. 역..
[Security] Spring Security Filters Spring Security Filter 웹 애플리케이션은 Tomcat 서블릿 컨테이너에 의해 구동이 된다. Tomcat 서블릿 컨테이너는 서블릿들을 관리해주는 역할을 하고 서블릿은 클라이언트의 요청을 처리하고 결과를 반환할 수 있도록 서블릿 클래스의 구현 규칙을 지켜 만드는 자바 웹 프로그래밍 기술이다. 서블릿에는 우리가 Spring MVC에서 사용되는 Front Controller인 DispatcherServlet이 존재하여 요청 URL에 대한 처리를 해준다. 또한, 서블릿에는 네트워크 통신의 사이 사이에서 여러 동작을 행하게 할 수 있는 클래스인 Filter가 존재한다. 이 필터들 중 DelegatingFilterProxy라는 것이 존재하고 서블릿 필터 처리를 스프링에 들어있는 빈으로 위임하고 싶을..
[Security] Authorization(Security Form Login 구현) 시작하기에 앞서 우리는 이전에 사용자의 인증(Authentication)에 대해서 다뤘었다. 이번에는 사용자의 인가(Authorization)에 대해 다뤄보려고 한다. 인가란 무엇일까? 우리는 Authentication에 Principal, Credentials뿐만 아니라 Authorities를 설정해줄 수 있었다. Principal과 Credentials는 인증하려는 사용자의 ID, PW 정보를 담고 있으며 Authorities는 권한 정보를 담고 있다. 우리는 권한 정보를 활용해 해당 사용자가 해당 URL에 접근할 권한이 있는지 확인하는 것이다. 이를 처리하는 필터에 대해서 살펴보자. FilterSecurityInterceptor 인가(Authorization)을 처리하는 필터는 바로 FilterSe..
[Security] Authentication(Security Form Login 구현) 이번 포스트는 저번에 다뤘던 Security Form Login에 대해서 직접 구현해보려고 한다. 현재, API 방식이 많이이뤄지고있지만 Form 로그인 방식도 충분히 많이 이뤄지고 있어 해보려고한다. 이 예제는 어떤 회원에 대한 로그인을 기준으로 진행해보려고 한다. 이 회원은 아이디, 비밀번호, 권한 총 세 가지를 가지고 있으며 회원가입 할 때 설정할 수 있다. 권한은 일반(USER), 관리자(ADMIN)으로 이루어져 있으며 관리자만 들어갈 수 있는 URL, 관리자와 일반 회원 모두 들어갈 수 있는 URL이 존재한다. /register : 회원가입 /login : 로그인 /logout : 로그아웃 /main : 메인 페이지(로그인 후 이용가능) /user : 일반(USER) 회원, 관리자(ADMIN) ..