막강한 인증(Authentication)과 인가(Authorization) 기능을 가진 프레임워크로, 스프링 기반의 애플리케이션 보안을 위한 표준이라고 보면 된다. 따라서 인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것이 적극적으로 권장된다.
스프링의 대부분 프로젝트들(MVC, Data, Batch 등)처럼 확장성을 고려한 프레임워크다 보니 다양한 요구사항을 손쉽게 추가하고 변경할 수 있다. 이런 손쉬운 설정은 특히 스프링 부트 1.5에서 2.0으로 넘어오면서 더욱 강력해졌다.
Oauth2 클라이언트란?
스프링 부트 프레임워크에서 OAuth 2.0 프로토콜을 사용하여 인증을 수행하는 클라이언트이다.
즉, OAuth 2.0 프로토콜을 사용하여 인증하는 클라이언트를 구현하는데 필요한 기능을 제공한다. 이를 통해 서비스 제공자의 API를 사용하고 인증된 사용자 정보를 가져올 수 있다. (참고1, 참고2)
많은 서비스에서는 로그인 기능을 ID/Password 방식보다는 구글, 페이스북, 네이버 로그인과 같은 소셜 로그인 기능을 사용한다. 그 이유는 로그인을 직접 구현하면 아래의 목록을 직접 구현해야 한다. (OAuth를 사용해도 구현해야 하는 것 제외) 즉, 배보다 배꼽이 커지는 경우가 많다.
따라서 OAuth 로그인을 구현하면 위의 목록을 모두 구글, 페이스북, 네이버 등에 맡기면 되므로 서비스 개발에 더욱 집중할 수 있다.
스프링 부트 1.5에서의 OAuth2 연동 방법이 2.0에서는 크게 변경되었다. 하지만 인터넷 자료들을 보면 설정 방법에 크게 차이가 없는 경우를 자주 볼 수 있다. 이는 spring-security-oauth2-autoconfigure
라이브러리 덕분이다. spring-security-oauth2-autoconfigure
라이브러리를 사용하면 스프링 부트 2.0에서도 1.5에서 쓰던 설정을 그대로 사용할 수 있다. 새로운 방법을 쓰기보다는 기존에 안전하게 작동하던 코드를 사용하는 것이 비교적 확실하므로, 많은 개발자가 이 방식을 사용해왔다.
하지만 지금은 스프링 부트 2.0 방식인 Spring Security Oauth2 Client
라이브러리를 사용해서 진행할 것이다. 그 이유는 아래와 같다.
spring-security-oauth
프로젝트를 유지 상태로 결정또한 스프링 부트 1.5 방식에서는 url 주소를 모두 명시해야 하지만, 2.0 방식에서는 client 인증 정보만 입력하면 된다. 1.5 방식에서 직접 입력했던 값들은 2.0 버전으로 오면서 모두 enum으로 대체되었다. CommonOAuth2Provider
라는 enum이 새롭게 추가되어 구글, 깃허브, 페이스북, 옥타(Okta)의 기본 설정값은 모두 여기서 제공한다. 그 이외의 다른 소셜 로그인(네이버, 카카오 등)을 추가한다면 직접 다 추가해 주어야 한다.
public enum CommonOAuth2Provider {
GOOGLE {
@Override
public Builder getBuilder(String registrationId) {
ClientRegistration.Builder builder = getBuilder(registrationId,
ClientAuthenticationMethod.CLIENT_SECRET_BASIC, DEFAULT_REDIRECT_URL);
builder.scope("openid", "profile", "email");
builder.authorizationUri("https://accounts.google.com/o/oauth2/v2/auth");
builder.tokenUri("https://www.googleapis.com/oauth2/v4/token");
builder.jwkSetUri("https://www.googleapis.com/oauth2/v3/certs");
builder.issuerUri("https://accounts.google.com");
builder.userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo");
builder.userNameAttributeName(IdTokenClaimNames.SUB);
builder.clientName("Google");
return builder;
}
},
...
}
참고: 스프링 부트 2 방식의 자료를 찾고 싶은 경우
spring-security-oauth2-autoconfigure
라이브러리를 사용했는지 확인하고,application.properties
또는application.yml
정보가 아래와 같이 차이가 있는지 비교해야 한다.스프링 부트 1.5
google: client: clientId: [클라이언트 ID] clientSecret: [클라이언트 Secret] accessTokenUri: https://accounts.google.com/o/oauth2/token userAuthorizationUri: https://accounts.google.com/o/oauth2/auth clientAuthenticationScheme: form scope: email, profile resource: userInfoUri: https://www.googleapis.com/oauth2/v2/userinfo
스프링 부트 2.0
spring: security: oauth2: client: clientId: [클라이언트 ID] clientSecret: [클라이언트 Secret]