사용자 신원을 확인하는 행위
사용자 권한을 확인하는 행위
- 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일
- 클라이언트인 웹 브라우저에 저장된 '쿠기'를 확인
- 구성요소
- Name(이름): 쿠키를 구별하는 데 사용되는 키(중복될 수 없음)
- Value(값): 쿠키의 값
- Domain(도메인): 쿠키가 저장된 도메인
- Path(경로): 쿠키가 사용되는 경로
- Expires(만료기한): 쿠키의 만료기한(만료기한이 지나면 삭제)
- 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
- 서버에서 클라이언트 별로 유일무이한 '세션 ID'를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
- 서버에서 생성한 '세션 ID'는 클라이언트의 쿠키값('세션 쿠키'라고 부름)으로 저장되어 클라이언트 식별에 사용됨
Aa | 쿠키(Cookie) | 세션(Session) |
---|---|---|
설명 | 클라이언트에 저장될 목저으로 생성한 작은 정보를 담은 파일 | 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용 |
저장 위치 | 클라이언트(웹 브라우져) | 웹 서버 |
사용 예 | 사이트 팝업의 "오늘 다시보지 않기" 정보 저장 | 로그인 정보 저장 |
만료 시점 | 쿠키 저장 시 만료일시 설정 가능 (브라우져 종료시도 유지 가능) | 다음 조건 중 하나가 만족될 경우 만료 됨 1. 브라우져 종료 시까지 2. 클라이언트 로그아웃 시까지 3. 서버에 설정한 유지기간 까지 해당 클라이언트의 재요청이 없는 경우 |
용량 제한 | 브라우져 별로 다름(크롬 기준) - 하나의 도메인 당 180개 - 하나의 쿠키 당 4KB(=4096byte) | 개수 제한 없음 (단, 세션 저장소 크기 이상 저장 불가능) |
보안 | 취약 (클라이언트에서 쿠키 정보를 쉽게 변경, 삭제 및 가로채기 당할 수 있음) | 비교적 안전 (서버에 저장되기 때문에 상대적으로 안전) |
스프링 시큐리티란 프레임워크는 스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해 줌으로써 개발의 수고를 덜어줌.
// 스프링 시큐리티
implementation 'org.springframework.boot:spring-boot-starter-security'
// Thymeleaf (뷰 템플릿 엔진)
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
@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()); ...