Security 관련 코드를 보며 기록

Chooooo·2023년 10월 19일
0

인턴생활

목록 보기
1/19

현재 하고 있는 프로젝트의 Security를 보며

Spring Security는 그냥 남의 코드 보면서 똑같이(?) 쳐봤지... 따로 생각을 해본 적은 없다.

[ Spring Security 구조 ]

  • 보안 관련된 3 요소
  1. 접근 주체(Principal)
  • 보호된 대상에 접근하는 사용자
  1. 인증(Authenticate)
  • 현재 사용자가 누구인지 확인하는 과정, 보통 로그인(아이디와 비밀번호)을 이용해 인증
  1. 인가(Authorize)
  • 현재 사용자가 특정 URL, 기능 들에 접근할 수 있는 권한이 있는지 검사하는 것.

😁 위의 3가지 요소에 연결해서 Spring Security의 전체적인 내용을 훑어보자

⚽ 코드를 보며 공부

@Component
public class SecurityProvider implements AuthenticationProvider {
	/*
	 * [ Authenticate(인증) ]
	 * 
	 * # 인증은 Spring Security의 AuthenticationManager를 통해 처리 # 실질적으로는 Manager가 아닌
	 * Manager에 등록된 AuthenticationProvider를 통해 인증이 처리 - AuthenticationManager는 가지고
	 * 있는 Provider들을 검색해서 인증을 처리하니까 AuthenticationProviderBuilder를 통해서 우리가 구현한
	 * AuthenticationProvider를 등록해주면 됨 -> 지금 이 클래스가 AuthenticationProvider를 구현해 인증을
	 * 처리하는 클래스 같음...
	 * 
	 * # Manager의 구현체는 만들지 않고 만들어져 있는 ProviderManager를 사용 # AuthenticationProvider의
	 * 경우 인증 구분에 따라 직접 구현
	 * 
	 */

	@Autowired
	private SignDetailsService userService;
	@Autowired
	private XPasswordEncoder passwordEncoder;
	@Autowired
	private MessageSource messageSource;

	/*
	 * [ Principal (접근 주체) ]
	 * 
	 * 현재 사용자의 정보를 가지고 있는 Principal을 가져오려면? Authentication에서 Principal을 가져올 수 있고
	 * Authentication은 SecurityContext에서, SecurityContext는 SecurityContextHolder를 통해
	 * 가져올 수 있다.
	 * 
	 * 	[ Authentication ] 
	 * 	
	 * 	현재 접근 주체의 정보, 인증 주체의 정보를 담는 목적
	 */
	@Override
	public Authentication authenticate(Authentication authentication) throws AuthenticationException {
		
		String username = authentication.getName();
		String password = (String) authentication.getCredentials(); //증명 값(비밀번호) 같은 것들을 가져옴
		
		Collection<? extends GrantedAuthority> authorities; //현재 사용자의 권한 정보를 가져옴.

		SignDetails user = (SignDetails) userService.loadUserByUsername(username);
		if (!passwordEncoder.matches(password, user.getPassword())) {
			throw new BadCredentialsException(
					messageSource.getMessage("security.bad_credentials", null, Locale.getDefault()));
		}

		authorities = user.getAuthorities();

		return new UsernamePasswordAuthenticationToken(user, password, authorities);
	}
	

	@Override
	public boolean supports(Class<?> authentication) {
		return true;
	}

	public SignDetailsService getUserService() {
		return userService;
	}

}

Authenticate(인증)

인증은 Spring Security의 AuthenticationManager를 통해 처리

  • 실질적으로 Manager가 아닌, Manager에 등록된 AuthenticationProvider를 통해 인증이 처리
  • AuthenticationManager는 가지고 있는 Provider들을 검색해서 인증을 처리하니까 AuthenticationProviderBuilder를 통해서 우리가 구현한 AuthenticationProvider를 등록해주면 된다. -> 위 클래스가 AuthenticationProvider를 구현해 인증을 처리.

Manager의 구현체는 만들지 않고 만들어져 있는 ProviderManager를 사용

  • AuthenticationProvider의 경우 인증 구분에 따라 직접 구현

Principal(접근 주체)

현재 사용자의 정보를 가지고 있는 Principal을 가져오려면? Authentication에서 Principal을 가져올 수 있고 Authentication은 SecurityContext에서, SecurityContext는 SecurityContextHolder를 통해 가져올 수 있다.

Authentication

현재 접근 주체의 정보, 인증 주체의 정보를 담는 목적


기록...

나중에라도 Spring Security에 대해서 제대로 공부하자.

  • 이번에 security 6.0도 나왔겠다.. 공부해야해!!!
profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글