Spring/Spring Security

Spring Security + JWT + OAuth 2.0 기능을 모두 구현하였으니 마지막으로 테스트를 진행해 봅시다. 테스트를 위한 추가 코드 기존에 JWT 기능을 구현하면서 생성한 'TokenApiController' 클래스에 API 테스트를 위한 메서드를 하나 추가해 줍니다. @RequiredArgsConstructor @RestController public class TokenApiController { ... // api 테스트 추가 @PostMapping("/test") public ResponseEntity testApi() { return ResponseEntity.ok() .body("성공"); } } 제가 하고 있는 사이드 프로젝트는 Frontend(FE) 서버가 인증 서버에 OAu..
저번 포스팅을 통해 'OAuthSecurityConfig' 클래스를 작성하였습니다. 아직 작성하지 않는 클래스는 틀만 만드시고 빈 클래스로 작성하셨을 텐데 이번 포스팅부터 비워진 클래스를 하나하나 채워보도록 하겠습니다. CookieUtil OAuth 2.0을 구현하기에 앞서 쿠키를 사용할 필요가 있습니다. 그때마다 쿠키를 생성하고 삭제하는 로직을 추가하면 번거로울 것입니다. 따라서 먼저 쿠키 생성을 위한 유틸리티 클래스를 구현하려고 합니다. public class CookieUtil { // 이름, 값, 만료기간을 바탕으로 쿠키를 생성한다. public static void addCookie(HttpServletResponse response, String name, String value, int ma..
이제 OAuth 2.0 설정을 위한 Spring Security 설정을 합니다. Gradle 의존성 추가 build.gradle에 Spring Security 의존성 추가를 합니다. implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation 'org.springframework.security:spring-security-test' OAuthSecurityConfig Spring Security를 활성화시키기 위한 작업을 진행합니다. 저는 Spring Boot 3.2.3 버전을 사용했기 때문에 Spring Security 6.1 버전으로 진행합니다. @RequiredArgsConstructor @Conf..
OAuth 2.0 로그인 기능을 구현하기 위해 기능을 지원하는 인증 서버에게 토큰을 제공받아야 합니다. 이번 포스팅에는 구글, 네이버, 카카오에 토큰을 제공받기 위한 설정을 정리합니다. Google Google Cloud 콘솔로 이동합니다. 다음과 같이 상단 프로젝트 선택을 클릭하고, 새 프로젝트를 만들어줍니다. 새 프로젝트의 이름을 정해줍니다. 프로젝트 생성이 완료되었다면 만들어진 프로젝트를 선택하고, API 및 서비스로 이동합니다. OAuth 클라이언트 ID를 선택합니다. 동의 화면 구성을 선택합니다. User Type을 설정합니다. OAuth 동의 화면에 보일 앱 이름과 사용자 이메일, 개발자 연락처 정보 등등 원하시는 대로 설정하시면 됩니다. 범위 추가 또는 삭제를 클릭합니다. 정보를 제공할 범위..
OAuth OAuth란? Open Authorization의 약어로 인증을 위한 개방형 표준 프로토콜을 말합니다. 이 프로토콜은 Third-Party 프로그램에게 리소스 소유자를 대신하여 리소스 서버에 제공하는 자원에 대한 접근 권한을 위임하는 방식을 제공합니다. OAuth라는 개념이 등장하기 전 보안 인증 방식에 대한 표준이 없었기에 웹 기반의 서비스를 제공하는 기업들이 독자적인 방법으로 인증 처리를 하였습니다. 이러한 웹 서비스는 점점 발전하면서 분산된 서비스들이 서로를 의존하고 정보를 공유하는 상황으로 오게 됩니다. 기업들은 서로 정보를 공유함으로써 더 나은 서비스를 제공할 수 있었지만, 각각의 기업은 정보를 가져오기 위해 독립적인 인증 수단 처리 과정을 거쳐야 했습니다. 이러한 과정에서 보안 문제..
앞 포스팅을 통해 JWT 기능 구현을 하였습니다. 이번 포스팅에서는 해당 코드가 제대로 동작하는 지 테스트 코드를 작성해보겠습니다. JWT 테스트(1): TokenProvider 임의로 JWT를 생성하기 위한 mocking 객체인 JwtFactory를 생성합니다. /** * JWT 토큰 서비스를 테스트하기 위한 mocking 용 객체 */ @Getter public class JwtFactory { private String subject = "test@gmail.com"; private Date issuedAt = new Date(); private Date expiration = new Date(new Date().getTime() + Duration.ofDays(14).toMillis()); pri..
JWT를 구현하기에 앞서 JWT의 취약점으로 토큰 탈취 시 유효기간을 만료시키거나 삭제할 수 없다고 했습니다. 이를 보완하기 위해 2개의 토큰을 생성하는 방식을 취하게 되며, 각각 Access Token, Refesh Token이라 합니다. Access Token & Refresh Token 클라이언트가 API를 요청할 때 사용하는 Access Token이라 부르며, 이때 Access Token이 만료가 될 시 재발급을 요청하기 위한 토큰을 Refresh Token이라 합니다. Access Token은 클라이언트가 보관하고, Refresh Token은 서버가 보관합니다. 즉 Refresh Token이 유효하면 서버가 Access Token을 재발급해주는 방식입니다. JWT설정(1): 의존성 설정 및 토큰..
들어가면서 이전 프로젝트를 진행하면서 OAuth 2.0과 Spring Security를 이용한 회원 기능을 구현한 경험이 있습니다. 그러나 여러 블로그 포스팅을 찾아보면서 OAuth 2.0과 JWT, 그리고 Spring Security를 조합하여 더욱 강력한 인증 및 인가 시스템을 구현한 애플리케이션을 많이 보았습니다. 이에 제가 사전에 충분한 지식을 습득하지 못한 상황에서 새로운 프로젝트 도전하게 되었습니다. 세션 기반 인증과 토큰 기반 인증 이전 프로젝트에서 Spring Security는 기본적으로 세션 기반 인증을 제공해주기 때문에 사용자의 정보를 담은 세션을 생성하고 저장해서 인증하는 방식을 사용했었습니다. 이를 세션 기반 인증이라 부르며, 세션에 접근만 하면 사용자의 정보를 쉽게 가져올 수 있다..
Hui._.
'Spring/Spring Security' 카테고리의 글 목록