기본 콘텐츠로 건너뛰기

라벨이 Spring Security인 게시물 표시

Dolphin 2

별도의 회원가입 없이 소셜 로그인 기능 제공으로 간편한 로그인 가능. Dolphin 프론트엔드는 회원가입 절차가 따로 없고, 간단하게 소셜 로그인 기능을 제공함으로써 회원가입, 인증절차를 생략했습니다. 우선, 간단하게 국내에서 잘 알려진 네이버의 API를 사용합니다. 네이버 개발자센터 웹사이트 에서 네이버 아이디로 로그인 기능을 살펴봅니다. 개발 문서를 자세히 살펴보고 API 신청을 합니다. 애플리케이션의 이름을 정하고 필요한 정보를 필수/선택에 체크합니다. 밑으로 내려보면 로그인 API 서비스 환경 부분에서 환경 추가 셀렉트박스에서 PC 웹을 선택하면 다음과 같은 입력폼이 나타납니다. 서비스 URL은 내 웹애플리케이션의 URL이 될 예정입니다. 지금은 개발상태이므로 localhost를 입력했습니다. Callback URL은 네이버 OAuth 인증 url로 호출하면, 인증절차 후 네이버에서 리다이렉트해줄 url을 뜻합니다. 저는 /naver/login 으로 했습니다. 등록이 완료되면 client-id와 client-secret 값을 제공해줍니다. 이 값을 이용해서 인증처리를 할 수 있습니다. spring.io 웹사이트의 튜토리얼 문서를 보면 Facebook 소셜 로그인 기능에 대한 설명이 자세하게 나와있습니다. 이 부분을 참고합니다. Spring Boot and OAuth2 pom.xml 파일에 의존성을 추가하고 Application 클래스에 @EnableOAuth2Sso 애너테이션을 선언합니다. 튜토리얼대로 application.yaml 파일(application.properties)에 설정 정보를 입력합니다. clientId, clientSecret 값은 네이버 개발자센터에서 받은 대로 입력합니다. accessTokenUri는 네이버의 경우 https://nid.naver.com/oauth2.0/token 입니다. userAuthorizationUri는 네이버의 경우 https://ni...

냉장고 가계부 프로젝트 35

Spring security 프레임워크에서 form login 방식으로 인증할 경우 Remember-Me 서비스를 제공할 수 있다. Remember-Me 서비스를 이용하면 쿠키에 인증토큰을 저장해두고 일정기간동안(default: 2주) 쿠키에 토큰이 있다면 인증처리를 해준다. 기본적으로 별도의 설정이 없다면 세션은 30분 만료시간으로 정해져있다.(WAS 마다 틀리다.) 세션 시간이 만료되면 세션에 저장된 정보가 날라가므로 다시 로그인을 해야한다. Remeber-Me 기능을 이용하면, form login에서 인증을 성공적으로 진행하는 경우 임의의 인증토큰을 생성해서 쿠키에 저장해두고 쿠키가 만료되기 전까지 쿠키값을 확인해서 인증을 진행한다. 별도의 설정을 하지 않으면 in-memory 기반의 쿠키저장소를 이용해서 쿠키 토큰인증을 하며, JDBC같은 저장소를 별도로 사용할 수도 있다. WebSecurityConfig 클래스에 다음과 같이 간단한 설정만으로 remember-me 기능을 추가할 수 있다. @Configuration @EnableWebSecurity @RequiredArgsConstructor public class WebSecurityConfig extends WebSecurityConfigurerAdapter { private final MemberUserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/", "/signup").permitAll() .requestMatchers(PathRequest.toStaticResources().atCommonLocations()...

냉장고 가계부 프로젝트 34

회원가입과 로그인, 로그아웃 기능은 구현했으니, 이제는 비밀번호 변경과 회원탈퇴기능을 구현한다. member 프로젝트의 MemberService 클래스에 탈퇴 메서드를 추가한다. @Service @Transactional @RequiredArgsConstructor public class MemberService { private final MemberRepository repository; public Member save(Member member) { return repository.save(member); } public void withdraw(long id) { repository.deleteById(id); } } withdraw 메서드는 파라미터로 회원 아이디를 입력받아서 repository의 deleteById 메서드를 호출한다. MemberController 클래스에서 비밀번호 변경, 회원탈퇴 endpoint를 작성한다. @RestController @RequestMapping("/members") @RequiredArgsConstructor public class MemberController { ... @PutMapping("/{id}") ResponseEntity<?> changeMemberPassword(@PathVariable final long id, @RequestBody final Member memberRequest) throws URISyntaxException { Member updatedMember = repository.findById(id) .map(member -> { member.setPassword(memberRequest.getPassword()); ...

냉장고 가계부 프로젝트 33

Spring security 의 권한 구분과 계정잠금/만료 정책관련 필드 정보를 제공하기 위해 Member 서버를 수정한다. CREATE TABLE member ( id BIGINT GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) PRIMARY KEY, username VARCHAR(256) NOT NULL, password VARCHAR(128) NOT NULL, account_non_expired BOOLEAN NOT NULL DEFAULT TRUE, account_non_locked BOOLEAN NOT NULL DEFAULT TRUE, credentials_non_expired BOOLEAN NOT NULL DEFAULT TRUE, enabled BOOLEAN NOT NULL DEFAULT TRUE ); ALTER TABLE member ADD CONSTRAINT UK_member_username UNIQUE (username); CREATE TABLE member_authorities ( member_id BIGINT NOT NULL, authority VARCHAR(32) NOT NULL ); member 테이블에는 account_non_expired, account_non_locked, credentials_non_expired, enabled 네 개의 Boolean 컬럼이 추가되고 Default 값은 true로 지정한다. 그리고 권한구분값을 저장할 member_authorities 테이블을 생성한다. member_authorities 테이블에는 member 테이블의 식별키 id값을 참조하는 member_id 컬럼과 문자열로 저장되는 권한구분 authority 컬럼으로 구성된다. @Data @NoArgsConstructor @Entity public class Member { @Id @Gene...

냉장고 가계부 프로젝트 32

fridge-member 프로젝트의 회원 가입을 위한 API를 추가한다. UI 서버에서 회원가입을 진행하면 아이디와 패스워드가 요청바디에 담겨서 member API를 POST 방식으로 호출한다. JPA repository 의 save 메서드를 호출하는 서비스 로직을 담는 MemberService 클래스를 우선 작성한다. @Service @Transactional @RequiredArgsConstructor public class MemberService { private final MemberRepository repository; public Member save(Member member) { return repository.save(member); } } 클래스에는 Service 애너테이션이 선언되고, Transactional 애너테이션이 선언되어 있다. Lombok 라이브러리의 RequiredArgsConstructor 애너테이션을 선언해서 repository 의존성을 생성자에서 주입한다. save 메서드는 Member 클래스를 파라미터로 전달받고 생성된 Member 객체를 리턴한다. 메서드 내부에서는 repository 의 save메서드를 호출한다. UI 서버에서 호출하는 endpoint인 컨트롤러 메서드를 MemberController 클래스에 추가한다. @RestController @RequestMapping("/members") @RequiredArgsConstructor public class MemberController { private final MemberRepository repository; private final MemberResourceAssembler assembler; private final MemberService service; ... @PostMapping ResponseEn...