이번 주특기 숙련과정 기능 구현 목록중 Spring Security,OAuth2 의 기능에 기록을 하려한다.
스파르타 강의 에선 나만의 셀렉샵 기반으로 강의를 알려주지만 나는 3주차 주특기입문때 만들어 두었던
메모 페이지위에 기능을 구현하려 한다.
이번과제의 목표
1. 웹의 인증 및 인가의 개념을 이해한다.
2. 스프링 시큐리티를 이용해 폼 로그인 기능을 구현한다.
3. 스프링 시큐리티 OAuth2를 이용해 소셜 로그인 기능을 구현한다.
4. JWT 로그인 기능을 구현한다.
웹의 인증 및 인가의 개념
인증과 인가는 비슷하지만 다른 개념이다.
- 인증 (Authentication): 사용자 신원을 확인하는 행위
- 인가 (Authorization): 사용자 권한을 확인하는 행위
웹에서의 인증과 인가
- 인증: 로그인을 통해 본인임을 확인 (주로, 아이디와 패스워드 이용)
- 인가: 주로 역할에 따른 사용 권한 관리 (예: 회원등급별마다 볼 수 있는 게시글, 첨부가능파일 크기)
쿠키와 세션
우리가 평소에 쓰는 주소창의 http는 상태를 저장하지 않는다.
클라이언트의 요청을 서버에게 보낸 후 응답을 받을 때까지가 한개의 http의 요청이다. 하지만http 상태는 기억되지 않기 때문에 웹서버에서는 1번과 2번이 같은 클라이언트의 요청인지 알 수 없다.
쿠키
- 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일이다
- 클라이언트 웹 브라우저에도 쿠키가 저장된다.
쿠키의 구성요소
- Name (이름): 쿠키를 구별하는 데 사용되는 키 (중복될 수 없음)
- Value (값): 쿠키의 값
- Domain (도메인): 쿠키가 저장된 도메인
- Path (경로): 쿠키가 사용되는 경로
- Expires (만료기한): 쿠키의 만료기한 (만료기한 지나면 삭제된다.)
세션
1.서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
2.서버에서 클라이언트 별로 유일무이한 '세션ID'를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
3.서버에서 생성한 '세션ID'는 클라이언트의 쿠키값으로 저장되서 클라이언트 식별에 사용됨
세션의 동작 방식
1.클라이언트가 서버에 처음으로 주소창을 넣어서 요청함
2.서버가 세션id를 생성해서 응답 헤더에 전달 (id가 12A345)
3.클라이언트에 세션쿠키를 저장
4.클라이언트가 로그인이나 다른기능을 한후에 서버에 2번요청
5.서버가 세션id를 보고 1번요청과 같은 클라이언트임을 인지
쿠키와 세션비교 표를 캡쳐해왔다. 설명과 저장위치를 먼저 이해한후 나중에 시간이 날때 보려고 짤라왔다.
스프링 시큐리티 프레임워크
스프링 시큐리티 프레임 워크는 스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해준다.
스프링 시큐리티 프레임워크 코드추가는
build.gradle 에
implementation 'org.springframework.boot:spring-boot-starter-security'
이렇게 한줄만 추가를 해주고
security 패키지 만든후 WebSecurityConfig 클래스를 생성해준다.
클래스 내부에는
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
public class WebSecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authz) -> authz
// 어떤 요청이든 '인증'
.anyRequest().authenticated()
)
// 로그인 기능 허용
.formLogin()
.defaultSuccessUrl("/")
.permitAll()
.and()
//로그아웃 기능 허용
.logout()
.permitAll();
return http.build();
}
}
추가해주면 끝.
메인 어플리케이션에서 실행을 하게되면
id값은 user
임시비밀번호 맨위에있는 a03~부터 치면 임시로 로그인구현이 가능하다.
댓글