Spring Security - 태그 라이브러리 / 로그인 정보 가져오기 / 암호화

S.Sun·2024년 4월 24일

스프링

목록 보기
14/17

질문 내용

  1. 아래의 태그에 대하여 설명하시오.
  • <sec:authorize access="isAnonymous()">
  • <sec:authorize access="isAuthenticated()">
  • <sec:authorize access="hasRole('ROLE_USER')">
  • <sec:authentication property="principal.email"/>
  1. 스프링 시큐리티에서 로그인 정보를 저장하는 세션객체에 대하여
    설명하시오.
  2. 컨트롤러 단에서 로그인 정보를 가져오는 3가지 방법은?
  3. 스프링 시큐리티 에서 암호화객체의 종류는?
  4. 암호화 hash 방식이란?
  5. 아래를 트라이 해보시오
- 아래의 패스워드 모듈을 프로젝트에 적용한후
- 로그인시 아이디는 emp의 ename 을 넣고 패스워드는 emp의 사원번호를 넣어 
로그인이 되도록 해보시오.
package edu.sejong.ex.security;
import org.springframework.security.crypto.password.PasswordEncoder;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class CustomNoOpPasswordEncoder implements PasswordEncoder {
	@Override
	public String encode(CharSequence rawPassword) {		
		log.warn("before encode: " + rawPassword);	
		return rawPassword.toString();
	}
	@Override
	public boolean matches(CharSequence rawPassword, String encodedPassword) {		
		log.warn("matches: " + rawPassword + " : " + encodedPassword);	
		return rawPassword.toString().equals(encodedPassword);
	}
}

개인 작성


<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> 
  • sec 태그
    - Spring Security를 사용하여 보안 관련 기능을 웹 페이지에서 쉽게 구현할 수 있도록 도와주는 태그

  • <sec:authorize access="isAnonymous()">
    - isAnonymous() : 익명 상태인 경우(로그인 OFF) 태그 내부의 컨텐츠 보여주기
  • <sec:authorize access="isAuthenticated()">
    - isAuthenticated() : 인증된 상태인 경우(로그인 ON) 태그 내부의 컨텐츠 보여주기
  • <sec:authorize access="hasRole('ROLE_USER')">
    - 현재 사용자가 특정 권한을 가지고 있는지 체크
    - hasRole('') : ''의 역할을 가진 사람에게 태그 내부의 컨텐츠 보여주기
  • <sec:authentication property="principal.email"/>
    - 현재 사용자의 인증 객체에서 특정 속성을 가져오기
    -> 해당 객체에서 email 값을 리턴하는 getter 함수를 이용해 가져옴
  • 로그인 정보를 저장하는 세션 객체는 주로 SecurityContext
  • 사용자의 인증 정보를 포함하고 있으며, 기본적으로 HttpSession을 통해 세션에 저장

  • SecurityContextHolder
    - Spring Security에서 현재 사용자의 보안 정보를 관리하는 역할.
    - 현재 실행 중인 스레드에 대한 보안 컨텍스트를 저장하고 제공.
  • SecurityContext
    - 현재 사용자의 보안 정보를 포함하는 객체.
    - 주로 SecurityContextHolder에 의해 관리되며, 인증 정보(Authentication)를 저장.
  • Authentication
    - 사용자의 인증 정보를 나타내는 인터페이스.
    - 주로 사용자의 식별 정보와 권한 정보를 포함.
  • Principal
    - 현재 사용자를 나타내는 객체.
    - 주로 사용자의 식별 정보를 포함.
  • Credentials
    - 사용자의 인증 자격 증명을 나타내는 객체.
    - 주로 비밀번호, 토큰 등이 포함될 수 있음.
  • Authorities
    - 사용자가 가지고 있는 권한을 나타내는 객체.
    - 주로 사용자의 역할이나 권한 정보를 포함.
  1. 컨트롤러에서 로그인 정보를 가져오는 3가지 방법
  • 해당 정보 처리를 위해, 처리하는 함수의 매개변수로 다음 객체를 포함해야 한다.

  • 1. Principal principal 객체를 갖고 오기

	   if(principal != null) {
		   System.out.println("타입 정보 : " + principal.getClass());
		   System.out.println("ID 정보 : " + principal.getName());
	   }
  • 2. Authentication authentication 객체를 갖고 오기
	   if(authentication != null) {
		   System.out.println("타입 정보 : " + authentication.getClass());
		   UserDetails user = (UserDetails) authentication.getPrincipal();
		   System.out.println("아이디 : " + user.getUsername());
		   System.out.println("패스워드 : " + user.getPassword());
		   System.out.println("권한들 : " + user.getAuthorities());
	   }
  • 3. SecurityContextHolder 를 바로 가져오기
    - 해당 경우에는 함수의 매개변수로 포함시킬 필요 없음.
	   UserDetails user = (UserDetails)SecurityContextHolder.getContext()
       					  									.getAuthentication()
                          									.getPrincipal();
	   if(user != null) {
		   System.out.println("아이디 : " + user.getUsername());
		   System.out.println("패스워드 : " + user.getPassword());
		   System.out.println("권한들 : " + user.getAuthorities());
	   }

PasswordEncoder 인터페이스를 구현한 클래스로

  • BCryptPasswordEncoder
  • Argon2PasswordEncoder
  • Pbkdf2PasswordEncoder
  • SCryptPasswordEncoder

등이 있다.

  • 해시(Hashing)
    - 해시는 임의의 길이의 데이터를 고정된 길이의 값으로 변환하는 과정.
    -> 이렇게 변환된 값은 해시 값 또는 해시 코드라고 함.
    - 동일한 입력값은 항상 동일한 해시 값을 생성하며, 해시 함수는 입력값에 대해 일관된 결과를 제공.
    - 해시 함수는 일방향 함수이므로, 해시 값을 통해 원본 데이터를 역으로 복원할 수 없음.
    - 대표적인 해시 함수로는 SHA-256, MD5, SHA-1 등이 있음.
    - 해시는 데이터의 무결성을 확인하거나 비밀번호의 안전한 저장을 위해 사용.

  • Spring Security 암호화 객체는 일반적으로 해시 함수를 기반. 즉, 해시 모듈이라고 보면 된다.
    - 단방향 암호화 모듈.

  • CustomNoOpPasswordEncoder의 두 내용을 살펴보면, 암호화 과정 없이 원본 그대로 활용하는 것을 확인할 수 있음.

WebSecurityConfigurerAdapter를 구현한 클래스 내 파일 수정 내용

	@Bean
	public PasswordEncoder passwordEncoder() {
		//return new BCryptPasswordEncoder();
		return new CustomNoOpPasswordEncoder();
	}

UserDetails를 구현한 클래스 내 파일 추가 내용

	public UserDetailsVO(EmpVO empVO) {
		log.info("===");
		log.info("UserDetailsVO로 들어온 EmpVO : " + empVO);
		log.info("===");
		this.setUsername(empVO.getEname());
		this.setPassword(String.valueOf((empVO.getEmpNo())));
		this.setAuthorities("ROLE_USER");
	}

	private void setAuthorities(String authority) {
		List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();	
		authorities.add(new SimpleGrantedAuthority(authority));
		this.authorities = authorities;
	}

profile
두리둥둥

0개의 댓글