Spring/Spring Security(8)
-
스프링 시큐리티 4. 로그인 정보 갱신(RefreshToken 구현)
[ 리프레시 토큰과 구현 로직 설명 ] 3편에서 JWT 토큰을 이용한 로그인 이후 발급되는 AccessToken를 유저에게 주었다. JWT 토큰의 특성으로 인해 DB 없이 상태유지를 하지 않고도 서명 시스템으로 인해 위조 여부를 판단할 수 있었다. 또한, JWT 토큰 내부 정보로 사용자의 아이디와 권한 정보를 이용해 불필요한 인증과정을 없앴다. 문제는 AccessToken은 강력한 권한을 가지고 있다. 서버 내에 저장되어있지 않기 때문에 AccessToken이 빼았겨버리면 만료시간까지 그 유저의 모든 권한을 공격자가 가질 수 있다. 그렇다고 보안을 위해 만료시간을 줄여버리면 사용자가 로그인을 매번해야 하는 불편함이 있다. 보통 이 문제를 해결하기 위해 RefreshToken과 Redis를 이용한 구현을 ..
2024.03.25 -
스프링 시큐리티 - OAUTH2
[ 용어 사항 ] 엔드 유저 서비스 요청을 하는 실제 어플리케이션 단에서 사용자로 서비스 이용 고객으로 생각하면 된다. 클라이언트 서버 React나 Flutter 등으로 만들어진 UI 어플리케이션으로 직접 엔드 유저와 상호작용하는 어플리케이션 서버라고 생각하면 된다. 인증 서버 OAUTH2 인증 시스템에서 인증 관련 정보만 처리해주는 서버라고 생각하면 된다. 리소스 서버 OAUTH2 인증 시스템에서 사용자에 관한 데이터를 가지고 있는 서버이다. 예를 들면 티스토리라면 사용자의 모든 글을 가지고 있는 서버라고 생각하면 된다. [ OAUTH2가 필요한 이유 ] 같은 기업 내의 서비스에서 OAUTH2의 장점 한 기업 내에 OAUTH2를 사용하면 서비스가 확장될 때마다 사용자가 각각의 서비스 별 인증을 위해 I..
2024.03.20 -
스프링 시큐리티 - 필터와 필터 디버깅
[ 스프링 시큐리티 필터 ] 스프링 시큐리티에는 필터라는 기능을 제공한다. 필터는 HTTP 요청이 올 때 작동하며, 필터에서 원하는 값들을 받아서 추가적인 처리를 해줄 수도 있고 문제가 있다면 컨트롤러까지 요청이 오는게 아니라 필터 선에서 요청을 끊어줄 수도 있다. 원하는 값과 내보내는 값은 HTTP 요청에 따른 서블릿 객체를 통해 사용이 가능한데, 그래서 filter를 살펴보면 다음처럼 doFilter()라는 메서드의 파라미터에 HttpServletRequest와 HttpS ervletResponse가 있다. 또한 filterChain은 다음에 어떤 필터에 해당 요청과 응답을 넘겨줄 지 정하는 역할을 한다. 따라서, 매번 필터를 작성할 때마다 어떤 요청에 있는 값을 사용하고 응답에 어떤 값을 전달할 지..
2024.03.18 -
스프링 시큐리티 3. 인가( JWT 기반 Token 인가 구현 )
[ 인증과 인가의 차이 ] 2편이었던 인증 글에서는 로그인을 한 뒤 서버 내에 저장된 정보가 일치하는 것을 확인하는 작업을 진행하였다. 이렇게 인증은 프로그램 자체에 접근 권한이 있는 사용자를 가려내는 과정이다. 반면 인가는 프로그램 자체에 접근 권한이 있는 사람이 인증을 받고, 내부 리소스에 접근을 할 때 그 내부 리소스에 접근할 수 있는 권한 또는 역할에 포함되는가를 살펴보는 과정이다. 그래서 인증은 인가보다 먼저 일어나며 주요 특징을 표로 정리해보면 아래와 같다. Authentication Authorization 시스템에 권한이 있는지 유저의 신원을 확인함 리소스 접근 시 유저에게 권한 또는 역할이 있는지 확인함 인증은 인가보다 우선적으로 일어남 인가는 인증 이후에 일어남 로그인 정보가 필요함 권..
2024.03.17 -
스프링 시큐리티 2. 인증(AuthenticationProvider 작동 방식과 커스텀 AuthenticationProvider 작성)
[ 스프링 시큐리티 기본 제공 인증 ] 스프링에서는 기본적으로 로그인 기능을 제공한다. 1에서 따로 계정을 만들 수 있는 로직을 만든 이유는 이 기본 설정을 바꿔 원하는 객체로 회원가입을 하고 로그인하는 서비스를 만들기 위함이다. 이를 달성하기 전에 스프링 시큐리티에서 기본 제공하는 로그인 기능을 확인해보고 무엇을 바꾸면 되는지를 알아보자. 기본 로그인을 확인하기 위해선 1편 프로젝트를 그대로 사용하고 SecurityCheckController라는 파일을 만들고 하단의 코드를 작성해주자. SecurityCheckController.java @RestController public class SecurityCheckController { @GetMapping("/security") public String..
2024.03.16 -
스프링 시큐리티 1. 암호화(PasswordEncoder를 통한 회원 가입 구현)
[ 암호화가 필요한 이유 ] 스프링 시큐리티를 통해 자체적으로 계정을 만든다면, 유저의 아이디와 비밀번호를 DB에 저장을 할 것이다. 많은 스프링 유튜브 강의에서 로그인을 할 때 비밀번호를 암호화해서 DB에 저장하는 걸 알려주지 않는다. 그래서 처음 로그인을 구현했을 때 이를 지키지 않았던 기억이 난다. 그래서 보안으로 반드시 기억해야 할 내용은 유저의 패스워드는 반드시 암호화를 해제할 수 없도록 단방향 암호화를 해서 저장해야 한다는 것이다. 그 이유는 DB 속의 내용은 안전하지 않다. SQL injection과 같은 방식으로 DB 속의 데이터가 갈취 당할 수 있으며 그 내용은 유저의 아이디와 비밀번호 테이블에서 가져올 내용일 수도 있다. 이 때 공격자에게 아이디와 비밀번호를 갈취당하더라도 서비스 상에선..
2024.03.16