막강한 인증(Authentication)과 인가(Authorization)기능을 가진 프레임워크입니다.
스프링 기반의 애플리케이션에서는 보안을 위한 표준이라 볼 수 있다.
인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것을 적극적으로 권장하고 있습니다.
많은 서비스에서는 로그인 기능을 구글, 페이스북, 네이버 로그인과 같은 소셜 로그인 기능을 사용합니다.
OAuth 로그인 구현 시 비밀번호 찾기, 로그인시 보안과 같은 기능을 구현하지 않아도 되기 때문에 서비스 개발에 집중할 수 있다.
스프링 부트 2.0에서 연동 방법이 크게 변경되었습니다. 하지만 인터넷 자료들을 보면 설정 방법에 크게 차이가 없는 경우를 자주 봅니다.
spring-security-oauth2-authoconfigure
라이브러리를 사용할 경우 기존에 쓰던 설정을 사용할 수 있다. 기존에 안전하게 작동하던 코드를 사용할 수 있다.
구글 클라우드 플랫폼 에서 프로젝트를 생성합니다.
생활코딩 구글 OAuth2 인증 에서 자세하게 과정을 볼 수 있습니다.
Enumrated(EnumType.STRING)
: JPA로 데이터베이스에 저장할 때 Enum 값을 어떤 형태로 저장할지를 결정한다. 숫자로 저장된다면 그 값이 무슨 코드를 의미하는지 알 수가 없기 때문에 String으로 저장될 수 있도록 선언한다.
스프링 시큐리티에서는 권한 코드 앞에 항상 ROLE_
이 앞에 있어야만 한다. 그래서 ROLE_USER, ROLE_GUEST 등으로 지정한다.
@EnableWebSecurity
: Spring Security 설정들을 활성화 시킨다.
http.csrf().disable().headers().frameOptions().disable()
: h2 화면을 사용하기 위해 해당 옵션들을 disable 한다.
authorizeRequest
: URL별 권한 관리를 설정하는 옵션이다. antMatchers 옵션을 사용할 수 있다.
antMatchers
: 권한 관리 대상을 지정한다. URL, HTTP 메소드별로 관리가 가능하다. permitAll() 옵션을 통해 전체 열람 권한을 줄 수 있다. hasRole()으로 특정 권한을 가진 사람만 가능하도록 했다.
registrationId
: 현재 로그인 중인 서비스를 구분
이후에 네이버 로그인 연동 시에, 구글과 네이버를 구분하기 위해 사용한다.
userNameAttributeName
: 로그인 진행 시 키가 되는 필드값을 이야기 한다.
OAuthAttributes
: Service를 통해 가져온 attribute를 담은 클래스입니다.
SessionUser
: 세션에 사용자의 정보를 저장하기 위한 Dto 클래스입니다.
처음 가입할 때 User의 엔티티를 생성한다. 가입할 때의 기본 권한을 GUEST로 주기 위해 role 빌더값에는 ROLE_GUEST
를 사용한다.
SessionUser에는 인증된 사용자 정보만 필요하기 때문 name, email, picture만 필드로 선언한다.