막강한 인증과 인가(권한 부여) 기능을 가진 프레임 워크
스프링 기반의 애플리케이션에서는 보안을 위한 표준
인터셉터, 필터 기반의 보안 기능을 구현하는 것 보다는 스프링 시큐리티를 통해 구현하는 걸 적극 권장
로그인 시 보안
회원가입 시 이메일 혹은 전화번호 인증
비밀번호 찾기
비밀번호 변경
회원정보 변경
spring-security-oauth2-autoconfigure
- 위 라이브러리를 사용하면 스프링부트2에서도 1.5의 설정을 그대로 가져올 수 있음
- 하지만, 해당 실습에서는 스프링부트2 방식인
Spring Security Oauth2 Client
라이브러리 사용- 스프링 부트 2 방식의 자료를 찾고 싶은 경우, 인터넷 자료들에서
spring-security-oauth2-autoconfigure 라이브러리
를 썻는지 확인하고,
application.yml
orapplication.properties
의 설정을 확인
- 1.5 방식에서는 url주소를 모두 명시
2.0 방식에서는 client 인증 정보만 입력
하면 된다. 이 외의 입력값들은 모두 CommonOAuth2Provider라는 enum이 추가 되어 기본설정값을 제공
(clietId와 clientSecret)을 통해서 로그인 기능과 소셜 서비스 기능을 사용할 수 있음
프로젝트 생성 후 API 서비스 카테고리로 이동
사용자 인증정보 > 사용자 인증정보만들기 > OAuth 클라이언트 ID
OAuth 동의 화면을 먼저 구성
사용자 인증 정보 > OAuth 클라이언트 ID 만들기
resources에 application-oauth.properties 생성
위와 같이 코드를 입력하고, 생성한 클라이언트 ID와 클라이언트 비밀번호를 입력
spring.profiles.include=oauth
application-oauth.properties
@Enumerated(EnumType.STRING)
각 사용자의 권한을 관리할 Enum클래스 Role 생성
👉🏻 User 엔티티 관련 코드를 모두 작성완료!
implementation('org.springframework.boot:spring-boot-starter-oauth2-client')
- 소셜 로그인 등 클라이언트 입장에서 소셜 기능 구현 시 필요한 의존성
- spring-security-oauth2-client와 spring-security-oauth2-jose를 기본으로 관리해주는 역할
config.auth
패키지 생성 -> 시큐리티 관련 클래스는 모두 이곳에 담기@EnableWEbSecurity
csrf().disable().headers().frameOptions().disable()
authorizeRequests
antMathcers
"/"
등 지정 된 URL들은 permitAll() 옵션을 통해 전체 열럼 권한을 줌"/api/v1/**"
주소를 가진 api는 USER 권한을 가진 사람만 가능하도록 열어줌anyRequest
logout().logoutSuccessUrl("/")
oauth2Login
userInfoEndpoint
userService
소셜 로그인 성공시 후속 조치를 진행할 UserService인터페이스의 구현체 등록
리소스 서버에서 사용자 정보를 가져온 상태에서 추가로 진행하고자 하는 기능을 명시!
registrationId
userNameAttributeName
OAuthAttributes
(Dto로 취급함)
SessionUser
of()
toEntity()
SessionUser
클래스 생성
왜? User클래스를 그대로 사용하지 않고, SessionUser로 별도로 사용할까?
🔻error
Failed to convert from type [java.lang.Object] to type [byte[]] for value 'com.jojoldu.book.springboot.domain.user.User@4a43d6'
- User 클래스를 그대로 사용하면 위와 같은 에러 발생
User 클래스를 세션에 저장하려고하면 직렬화를 구현하지 않았다는 에러가 발생 (cf.자바의직렬화)
User 클래스는 엔티티 클래스이기 때문에 언제 다른 엔티티와 무슨 관계가 생길지 알 수 없으므로 성능이슈, 부수 효과등 문제점이 발생. 따라서 직렬화 기능을 가진 세션 Dto를 추가로 만드는 거싱 이후 운영 및 유지보수에 유리
{{#userName}}
a href = "/logout"
{{^userName}}
a href="/oauth2/authorization/google"
Application을 실행하고 구글 로그인을 누르면 구글 로그인 창이 뜨고, UserDB에 가입정보가 잘 들어온 걸 확인할 수 있음
👉🏻 하지만 현재 로그인 된 권한이 GUEST이기 때문에 Post를 등록할 수가 없다.
update user set role = 'USER'
을 사용해 role을 USER로 바꿔주면 글쓰기가 가능해진다.