spring_boot 05

xddongx-hyeon2·2021년 12월 2일
0

spring_boot

목록 보기
5/11

인증(Authentication)

사용자 신원을 확인하는 행위

인가(Authoriztion)

사용자 권한을 확인하는 행위

쿠기

  • 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일
  • 클라이언트인 웹 브라우저에 저장된 '쿠기'를 확인
  • 구성요소
    • Name(이름): 쿠키를 구별하는 데 사용되는 키(중복될 수 없음)
    • Value(값): 쿠키의 값
    • Domain(도메인): 쿠키가 저장된 도메인
    • Path(경로): 쿠키가 사용되는 경로
    • Expires(만료기한): 쿠키의 만료기한(만료기한이 지나면 삭제)

세션

  • 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
  • 서버에서 클라이언트 별로 유일무이한 '세션 ID'를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
  • 서버에서 생성한 '세션 ID'는 클라이언트의 쿠키값('세션 쿠키'라고 부름)으로 저장되어 클라이언트 식별에 사용됨

쿠키와 세션 비교

Aa쿠키(Cookie)세션(Session)
설명클라이언트에 저장될 목저으로
생성한 작은 정보를 담은 파일
서버에서 일정시간 동안 클라이언트
상태를 유지하기 위해 사용
저장 위치클라이언트(웹 브라우져)웹 서버
사용 예사이트 팝업의 "오늘 다시보지 않기" 정보 저장로그인 정보 저장
만료 시점쿠키 저장 시 만료일시 설정 가능
(브라우져 종료시도 유지 가능)
다음 조건 중 하나가 만족될 경우 만료 됨
1. 브라우져 종료 시까지
2. 클라이언트 로그아웃 시까지
3. 서버에 설정한 유지기간 까지
   해당 클라이언트의 재요청이 없는 경우
용량 제한브라우져 별로 다름(크롬 기준)
- 하나의 도메인 당 180개
- 하나의 쿠키 당 4KB(=4096byte)
개수 제한 없음
(단, 세션 저장소 크기 이상 저장 불가능)
보안취약
(클라이언트에서 쿠키 정보를 쉽게 변경,
삭제 및 가로채기 당할 수 있음)
비교적 안전
(서버에 저장되기 때문에 상대적으로 안전)

스프링 시큐리티

스프링 시큐리티란 프레임워크는 스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해 줌으로써 개발의 수고를 덜어줌.

build.gradle

// 스프링 시큐리티
implementation 'org.springframework.boot:spring-boot-starter-security'
// Thymeleaf (뷰 템플릿 엔진)
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

WebSecurityConfig.java

@Configuration
@EnableWebSecurity                      // 스프링 Security 지원을 가능하게 함
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    // 패스워드 암호화화
    @Bean
    public BCryptPasswordEncoder encodePassword() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.headers().frameOptions().disable();
        http.authorizeRequests()
                // image 폴더를 login 없이 허용
                .antMatchers("/imgaes/**").permitAll()
                // css 폴더를 login 없이 허용
                .antMatchers("/css/**").permitAll()
                // user로 시작되는 페이지는 인증없이 시작 가능하게
                .antMatchers("/user/**").permitAll()
                .antMatchers("/h2-console/**").permitAll()
                .anyRequest().authenticated()                   // 어떤 요청이 오던지 로그인 과정이 없으면 로그인을 하겠다.
                .and()
                .formLogin()                                    // 로그인 페이지에 대해서는
                .loginPage("/user/login")                       // 로그인이 필요할 때 피요한 위치를 지정
                .failureUrl("/user/login/error")                // 로그인에 실패 했을 때
                .defaultSuccessUrl("/")                         // 로그인 완료 후 home
                .permitAll()                                    // 허용
                .and()
                .logout()                                       // 로그아웃
                .logoutUrl("/user/logout")                      // 로그아웃 url
                .permitAll()                                    // 허용
                .and()
                .exceptionHandling()
                .accessDeniedPage("/user/forbidden");           // 인기가 되지 않았을 때 여기
    }

패스워드 암호화

스프링 시큐리티에서 제공해주고, 권고되고있는 BCrypt 해시함수를 활용해 패스워드 암호화. 암호화는 되지만 복호화는 되지 않는 '일방향'알로리즘을 사용.

@Bean
public BCrytPasswordEncoder encodePassword() {
	retur new BCryptPasswordEncoder();
}
	...
	String password = passwordEncoder.encode(requestDto.getPssword());
    ...

0개의 댓글