[스파르타코딩클럽] Spring 심화반 2주차

MOON·2021년 9월 7일
0
post-thumbnail

Spring 심화반 2주차

💡기대하는 것

웹의 인증 및 인가 개념을 배우고 스프링 시큐리티를 통해 로그인 기능을 구현
OAuth2를 이용해서 소셜 로그인 기능을 구현

📝배운것

  • 웹의 인증 및 인가 개념
  • 스프링 시큐리티를 이용한 인증 및 인가 관리방법
  • 스프링 시큐리티를 이용해서 로그인 기능 구현
  • OAuth2를 이용한 소셜 로그인

✏️웹의 인증 & 인가

인증 (Authentication): 사용자 신원을 확인하는 행위
인가 (Authorization): 사용자 권한을 확인하는 행위

웹에서의 인증 및 인가

  • 인증: 로그인을 통해 본인임을 확인
  • 인가: 주로 역할에 따른 사용 권한 관리
    예) 웹 카페 사이트에서 회원 랭킹 별 가능한 첨부파일 크기를 다르게 부여

✏️쿠키와 세션

사용자를 구별하지 못 하는 HTTP

HTTP 는 상태를 저장하지 않습니다. ('Stateless' 하다)

  • 아래 그림에서 클라이언트의 요청 (GET http://spartcodingclub.kr)을 서버에게 보낸 후 응답을 받을 때까지가 하나의 HTTP 요청입니다. 하지만 HTTP 상태는 기억되지 않기 때문에 웹 서버에서는 1번과 2번이 같은 클라이언트의 요청인지 알 수 없습니다.

인증과 인가에 사용되는 쿠키 & 세션

쿠키와 세션 모두 HTTP 에 상태 정보를 유지(Stateful)하기 위해 사용됩니다. 즉, 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 됩니다.

쿠키와 세션 비교

✏️스프링 시큐리티 프레임워크

스프링 시큐리티' 프레임워크는 스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해 줌으로써 개발의 수고를 덜어 줍니다. 마치 '스프링' 프레임워크가 웹 서버 구현에 편의를 제공해 주는 것처럼요!

build.gradle 에 추가

// 스프링 시큐리티
implementation 'org.springframework.boot:spring-boot-starter-security'

spring security 활성화

@Configuration
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.headers().frameOptions().disable();

        http.authorizeRequests()
                // image 폴더를 login 없이 허용
                .antMatchers("/images/**").permitAll()
                // css 폴더를 login 없이 허용
                .antMatchers("/css/**").permitAll()
                // 그 외 모든 요청은 인증과정 필요
                .anyRequest().authenticated()
                
                .and()
                // 로그인 관련
                .formLogin()
                // 로그인 페이지 URL 설정 GET
                .loginPage("/user/login")
                // 로그인 기능 수행 POST
                .loginProcessingUrl("/user/login")
                // 로그인 성공 후 URL 설정
                .defaultSuccessUrl("/")
                .permitAll()
                
                .and()
                // 로그아웃 관련
                .logout()
                .permitAll();
}

✏️패스워드 암호화 구현

회원 등록 시 '비밀번호'는 사용자가 입력한 문자 그대로 DB 에 안 된다는 사실.
'정보통신망법, 개인정보보호법' 에 의해 비밀번호는 암호화(Encryption)가 의무

사용자는 본인이 기억하는 패스워드를 입력하면 우리가 구현한 서버에서 해당 암호를 암호화하고 DB 에 저장된 암호화된 패스워드와 비교합니다. 이렇게 서버에서는 사용자의 평문 암호를 모르지만 사용자가 등록한 패스워드와 일치하는지 여부는 알 수 있죠.

암호화 구현

스프링 시큐리티에서 제공해 주고, 권고되고 있는 'BCrypt' 해시함수를 사용해 패스워드를 암호화

    @Bean
    public BCryptPasswordEncoder encodePassword() {
        return new BCryptPasswordEncoder();
    }

✏️로그인 & 로그아웃 구현

  • 우리가 구현해 줘야 할 클래스
    1. UserDetailsService 인터페이스 → UserDetailsServiceImpl 클래스
    2. UserDetails 인터페이스 → UserDetailsImpl 클래스

✏️접근 불가 페이지 구현

사용자는 관리자 페이지에 인가되지 않아야 한다.
스프링 시큐리티 설정을 이용해 '관리자'만 접속 가능한 페이지를 설정할 수 있다.

  • 스프링 시큐리티가 로그인한 회원의 권한을 인식하도록 수정

UserDetailsImpl.java

private static final String ROLE_PREFIX = "ROLE_";
    
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        UserRole userRole = user.getRole();

        SimpleGrantedAuthority authority = new SimpleGrantedAuthority(ROLE_PREFIX + userRole.toString());
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(authority);

        return authorities;
    }
  • SecurityConfig 수정
.exceptionHandling()
.accessDeniedPage("/user/forbidden");
  • 컨트롤러에서 인가가 필요한 API 에 @Secured 어노테이션과 "ROLE 이름" 추가
@Secured("{ROLE 이름}")

이제 해당 URL 접근 시, 스프링 시큐리티가 로그인 시도하는 회원이 관리자 역할을 가지고 있는지 인가합니다. 만약 관리자 권한을 가지고 있지 않은 회원의 요청이라면, 스프링 시큐리티 설정에 따라 접근 금지 페이지를 내려줍니다.

서버에서는 접근 권한에 대한 응답을 "HTTP Status Code 403 (Forbidden)" 으로 정의해두고 사용합니다.

✏️소셜로그인

모든 웹 사이트에서 회원가입 과정을 거치는 것은 사용자에게 부담이 됩니다.

매번 번거로운 회원가입 과정을 수행해야 할 뿐 아니라, 웹 사이트마다 다른 아이디와 비밀번호를 기억해야 합니다.

또한 웹 사이트를 운영하는 측에서도 회원들의 개인정보를 지켜야하는 역할이 부담이 됩니다. 바이러스와 백신의 관계 처럼, 발전하는 해킹 기술을 막기 위해 보안을 강화하는 노력이 지속적으로 필요하기 때문이죠.

이런 문제를 해결하기 위해 OAuth 를 사용한 소셜 로그인이 등장합니다.

OAuth란?

OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준입니다. 사용자가 애플리케이션에게 모든 권한을 넘기지 않고 사용자 대신 서비스를 이용할 수 있게 해주는 HTTP 기반의 보안 프로토콜 입니다.
OAuth를 사용하는 서비스 제공자는 대표적으로 구글, 페이스북 등이 있습니다. 국내에는 대표적으로 네이버와 카카오가 있죠.

카카오 로그인 설정

0개의 댓글

관련 채용 정보