spring security 12

🤦🏻‍♀️고민하기 - Spring Security_API 경로에 따른 인증 및 역할 관리(2)

🌑 상황1. 아래의 블로그를 보면 알 수 있듯이 API 네이밍 컨벤션 말고, 새로 알게 된 @PreAuthorize, @PostAuthorize을 써보기로 했는데 Swagger UI까지 사용하다보니 Controller에 있는 메서드 상단에 붙어있는 어노테이션들이(아래의 사진처럼) 너무 많아지니까 불안(?)해졌다. 코드는 깔끔하고, 한눈에 보기 좋은 것이 미덕이라고 알고 있는데 부피가 커지는 것에 대한 막연한 걱정이 생긴 것이다. 그래서 API 경로(인증이 필요 있는 API와 필요 없는 API의 구분)에 따른 인증 방법에 대해서 "다시"고민해보았다. 2. 그리고 API 경로 자체도 딱! 규칙을 정해서 일관되게 하고 싶은데, controller마다 제각각인 느낌이라 이 부분도 확실히 잡고 넘어가려고 한다~..

🤦🏻‍♀️고민하기 - Spring Security_API 경로에 따른 인증 및 역할 관리(1)

🌑 상황최근 팀 기능을 개발하면서 각 기능별로 보안 설정에 대해 고민해 보게 되었다.특히, API의 보안 설정을 어떻게 관리할지에 대해 여러가지 방법을 검색해 보고 고려하게 되었는데 가장 대표적인(?) API 네이밍 컨벤션과 Spring Security를 활용하는 방법 중에서 고르기로 했다. 🌗 과정API 네이밍 컨벤션가장 먼저 생각이 든건 API 네이밍 컨벤션을 통해 인증이 필요한 경로를 구분 짓고 싶었다.예를 들어, /api/team/secure/** 이런 식으로 인증이 필요한 경로라는 것을 config 파일에 등록하여 직관적으로 표현하는 것이 한눈에 보기 좋다는 생각이 들었다. 하지만 이 방식으로 진행했을 때의 단점은모든 보안 요구상을 경로에 반영하면 복잡해질 위험이 있다.역할별 접근 권한까지 ..

[11강] 네이버 로그인 완료

🤍[네이버 개발자 사이트]에 들어가서 다음과 같이 진행하여 id와 비밀번호를 발급받아 준다. 🤍앞서 진행한 것과 마찬가지로 해당 값을 각각 코드에 넣어준다. # naver OAuth2 설정 spring.security.oauth2.client.registration.naver.client-id=vFzQdx0GIL_gWvfx9i1k spring.security.oauth2.client.registration.naver.client-secret=[비밀번호 값] spring.security.oauth2.client.registration.naver.scope=email,profile spring.security.oauth2.client.registration.naver.client-name=Naver spri..

[10강] 페이스북 로그인 완료

🤍받은 인증 정보들을 코드에 기입해 주기 색깔에 맞춰서 각각 정보들을 기입해 주면 된다. 🤍oauth에서 제공하는 규격에 맞게 요청 url을 작성한다. OAuth2 클라이언트 애플리케이션에서 정의한 OAuth2 공급자(여기서는 Facebook)에 대한 인증을 시작하라는 요청을 나타내는 것이다!! ( OAuth2 클라이언트의 구성에 따라 "facebook" 부분이 다른 OAuth2 공급자 이름으로 대체될 수 있다.) 🤍1차 테스트(?)로 요청을 해본다...!! (성공) 로그인을 하고 나면 다음 사진에 있는 과정을 거치게 된다. (이 강의 이전에 작성해 놓은 코드가 작동을 하는 것이다 - oauth 로그인에 대한 처리를 다 해놓았기 때문에 바로 기본적인 정보가 따라온다.) 핑크색 박스의 내용을 보면 face..

[8강] Authentication 객체가 가질 수 있는 2가지 타입

로그인 방식은 2가지가 있다. 일반 로그인 aouth 로그인 > 일반로그인으로 접근하려면 controller에서 @AuthenticationPrincipal PrincipalDetails userDetails > 구글로그인으로 접근하려면 controller에서 @AuthenticationPrincipal OAuth2User oauth => 일반 로그인은 PrincipalDetails 에서 유저 정보를 가지고 오는 것이고, oauth 로그인에서는 OAuth2User에서 유저의 정보를 가지고 오는 것이다. 이처럼 서로 다른 두 로그인 방식에 접근하기 위해서 서로 다른 방식을 사용해야한다, 🗝️해결 기존 PrincipalDetails 클래스는 1) 아래처럼 UserDetails만 구현하는 상태였지만 2) 추가..

[7강] 구글 회원 프로필 정보 받아보기

🏕️상황 현재 상태는 구글로 로그인을 완료한 것까지다. 로그인만 했을 뿐 그 뒤에 어떻게 처리를 할지는 아직 구성하지 않았다. 💦과정 .userInfoEndpoint() OAuth 2.0 로그인 프로세스의 일부로 사용자 정보를 가져오는 데 관련된 설정을 제공한다. 이 메서드는 사용자 정보 엔드포인트(User Info Endpoint)와 관련된 구성을 정의한다. .userInfoEndpoint()는 사용자 정보를 가져오는 방법과 구조를 설정한다. .userService() 사용자 정보를 가져온 후에 해당 정보를 어떻게 처리할지를 정의한다. principalOauth2UserService는 사용자 정보를 처리하기 위한 사용자 정의 서비스 빈(Bean)을 참조한다. 사용자 정보를 가져온 후에, 이 메서드를 사..

[6강] 구글 로그인 준비

1. 해당 사이트에 접속한다. https://console.cloud.google.com/projectcreate?previousPage=%2Fapis%2Fdashboard%3Fhl%3Dko%26project%3Dsrpingboot-outh&organizationId=0&hl=ko Google 클라우드 플랫폼 로그인 Google 클라우드 플랫폼으로 이동 accounts.google.com 2. 프로젝트를 하나 생성한다. 3. User Type을 설정한다. (1단계에서 이메일만 필수적으로 작성해야 해서 작성하고 그 뒤에 적어야 하는 곳들은 모두 skip) 4. 사용자 인증 정보 만들기 여기서 https로 요청했는데 그러면 로컬 프로젝트용으로는 오류가 난다. http로 해야 한다. --------------..

[5강] 메소드 단위로 권한 설정하기 - @Secured

이렇게 핑크 박스의 코드처럼 설정해 주면 이 프로젝트 전역에 권한을 설정해 줄 수 있다. 그런데 이번 강의에서 배운 내용은 하나의 메소드(요청, url) 단위로 권한을 설정해 줄 수 있는 방법에 대해 알아보았다. @Secured @Secured("ROLE_ADMIN") @GetMapping("/info") public @ResponseBody String info() { return "개인정보"; } "/info"에 접근하려면 유저의 Authorities이 ROLE_ADMIN이어야 한다. 이렇게 함수 단위로 접근할 수 있다. @PreAuthorize @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')") @GetMapping("/data") ..

[4강] 스프링 시큐리티 로그인 구현 - '?error' 발생

🏕️상황 강의를 따라 하던 중에 회원가입은 정상적으로 작동했으나 '로그인'에서 로그인이 되지 않고 아래의 사진처럼 오류가 발생했다. 미쳐버릴 지경이었다. 콘솔에는 아무런 오류도 찍히지 않고, 심지어 두 번째 사진처럼 사용자 정보도 굉장히 잘 찾아지는데 왜 로그인만 안 되는지 답답하고, 막막했다. 진짜로 두 번째 사진처럼 콘솔에는 아무런 오류도 없었다. 💦과정 1. 관련이 있는 클래스들을 돌아다니며 코드를 수정해보았지만 무용지물.... 2. WebSecurityConfigurerAdapter의 deprecated로 인한 코드 수정.... 강의에서는 WebSecurityConfigurerAdapter를 사용하여 코드상에 해당 부분에 줄이 그어져 있는(deprecated) 상황이었다. 그래서 검색해보니 인프런..

[3강][4강] spring security 회원가입/로그인

[3강] @Autowired private UserRepository userRepository; @PostMapping({"/join"}) //securityConfig 파일 생성 후 작동안함. public String join(User user) { System.out.println(user); user.setRole("ROLE_USER"); String rowPassword = user.getPassword(); String encPassword = bCryptPasswordEncoder.encode(rowPassword); user.setPassword(encPassword); userRepository.save(user); return "redirect:/loginForm"; } 위의 과정은 로..