본문 바로가기

오늘의 공부 & 기록

로그인, 로그아웃 기능 구현

일방향 암호 알고리즘

암호화: 평문 -> 암호화 알고리즘 -> 암호문

복호화: 불가

 

사용자는 로그인 할 때 패스워드(평문)입력 -> 서버에 로그인 요청 

서버: 평문 -> 암호화 알고리즘 -> 암호문

DB에 저장된 아이디, 패스워드(암호문) 일치 여부 확인

 

패스워드 암호화 적용하기

BCrypt 해시함수 사용

BCrypt 해시함수: 스프링 시큐리티에서 권고하는 암호화 적용 방법

 

1. 암호화 알고리즘을 빈(Bean)으로 등록

 

로그인, 로그아웃 처리 과정 이해

스프링 시큐리티 사용 전

 

 

 
 
스프링 시큐리티 사용 후
 

 

 
Spring Security: 인증/인가 통과한 사용자 정보(UserDetails)를 컨트롤러에게 보냄

Client: 클라이언트가 username, password로 로그인 시도 -> 인증 관리자에게 요청

Authentication Manager(인증 관리자): 클라이언트에게 받은 usernam을 UserDetails Service로 보냄

UserDetails Service: 회원 정보 DB에서 회원 정보를 usename으로 조회, 성공 -> 회원 상세정보(UserDetails)생성, 실패 -> Error 발생

Authentication Manager(인증 관리자)는 로그인 한 username, password와 UserDetails 일치 여부 확인

일치: 로그인 성공 -> Session 생성, 불일치: Error 발생

세션 아이디 발급해서 유효시간까지 인증

 

 

  1. 회원 상세정보 (UserServiceImpl) 를 통해 "권한 (Authority)" 설정 가능
  2. 권한을 1개 이상 설정 가능
  3. "권한 이름" 규칙
    1. "ROLE_" 로 시작해야 함
         "**USER**" 권한 부여 → "**ROLE_USER**"
      
    2. 예) "ADMIN" 권한 부여 → "ROLE_ADMIN"

 

  1. 스프링 시큐리티를 이용한 API 별 권한 제어 방법
    • Controller 에 "@Secured" 어노테이션으로 권한 설정 가능
      • @Secured("권한 이름") 선언
        • 권한 1개 이상 설정 가능
// (관리자용) 등록된 모든 상품 목록 조회
    @Secured("ROLE_ADMIN")
    @GetMapping("/api/admin/products")
    public List<Product> getAllProducts() {
        return productService.getAllProducts();
    }

"@Secured" 어노테이션 활성화 방법

@Configuration
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
@EnableGlobalMethodSecurity(securedEnabled = true) // @Secured 어노테이션 활성화
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

 

일반회원과 관리자 

 

1. 프론트 개발자와 작업 방법 논의

서버에서 역할을 프론트에 내려줄 수 있는 방법

1) 로그인 성공 시 Response에 회원 Role 추가

2) 쿠키 사용: 세션 유지를 위해 쿠키 설정

3) indwx.html에 admin 데이터 추가

관리자인 경우에만 "admin" id를 가진 <div>추가 (동적 웹 페이지 사용)

프론트 개발자 작업: "admin" id가 내려오면 관리자로 판단 -> 상품 조회 시 역할별로 분리하여 API 호출