1. 스프링 시큐리티의 세션

1-1. SpringSecurity와 Session의 관계

  • 인증 성공하면, 서버는 사용자에게 SessionID를 발급된다.
  • 발급된 SessionID는 인메모리 세션 저장소인 SecurityContextHolder에 저장된다.
  • 사용자의 브라우저에는 SessionID를 저장한다.
  • 이후 서버에 요청할 때마다 Request Header에 쿠키를 포함해서 보내는데, 여기에는 SessionID도 포함된다.
  • 서버에서는 Request에 포함된 SessionID와 비교하여 Session의 유효성을 판단한다.

 

1-2. SpringSecurity로 Session 이용

/* Controller 객체 */
@GetMapping("/loginInfo")
public String loginInfo(Principal principal) {
	// 1.Controller를 통하여 Principal객체로 가져오는 방법
	String user_id = principal.getName();
	System.out.println("유저 아이디:" + user_id);

	// 2.SpringContextHolder를 통하여 가져오는 방법(일반적인 빈에서 사용 할수있음 )
	Authentication auth = SecurityContextHolder.getContext().getAuthentication();
	user_id = auth.getName();
	System.out.println("유저 아이디:" + user_id);

	// 3.
	UserDetails userDetails = (UserDetails) auth.getPrincipal();
	System.out.println(userDetails.getUsername());

	// 4.
	MemberVO memberVO = (MemberVO) auth.getPrincipal();
	System.out.println(memberVO.getPassword());

      
	// 4.User 클래스로 변환 하여 가져오는 방법
	User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
	user_id = user.getUsername();
	System.out.println("유저 아이디:" + user_id);

	return "home";
}

 

 

2. 스프링 시큐리티의 공격기법

2-1. 해킹

2-1-1. 정의

: 시스템의 취약점을 공격해 시스템을 장악하는 기술. 여기서는 크래킹(Cracking)에 해당.

 

2-2-2. 해킹의 목표

  • 해당 시스템 버전 정보 파악(리눅스, 윈도우 서버 등)
  • 어드민의 정보를 탈취

 

2-2. CSRF(Cross Site Request Forgery)

2-2-1. 원리

: URL상에서 입력된 개인 정보가 담긴 링크들을 통해 대략적인 패턴들을 파악하여 개인정보 변경요청(피싱 사이트)을 유도후 해당 부분을 서버에 넘기는순간 강탈하여 공격자가 정보를 취한다.

 

2-2-2. 방지

: 2차 비밀번호로(토큰) 한 번의 인증으로만 서버에 정보를 보내는것을 차단, 피싱 사이트인지 아닌지 판별할 수 있다.

 

2-2-3. 구현

<!-- XML에서 적용 -->
<http auto-config="true" use-expressions="true">
	<csrf disabled="false"/>
</http>
<!-- JSP에서 적용 -->
<!-- form:form JSTL 태그 미사용시 적용 -->
<!-- csrf를 통한 32비트 번호를 별도로 보내 한 번 더 비교검증 유도 -->
<input name="${_csrf.parameterName}" type="hidden" value="${_csrf.token}"/>
/* Ajax에서 적용 */
function ajaxCall(){
	var token = $("meta[name='_csrf']").attr("content");
	var header = $("meta[name='_csrf_header']").attr("content");
	var name = $("#userName").val();
		
	var jsonData = {
		"name" : name
	}
		
	$.ajax({
		type: 'POST',
		contentType: "application/json",
		url:'/csrf/ajax',
		data: JSON.stringify(jsonData), // String -> json 형태로 변환
		beforeSend : function(xhr) {
			/* 데이터를 전송하기 전에 헤더에 csrf값을 설정한다 */
			xhr.setRequestHeader(header, token);
		},
		dataType: 'json', // success 시 받아올 데이터 형
		async: true, //동기, 비동기 여부
		cache :false, // 캐시 여부
		success: function(data) {
			console.log(data.name);
		},
		error:function(xhr,status,error){
			console.log('error:'+error);
		}
	});
}

 

2-2-4. Captcha(Completely Automated Public Turing test to tell Computers and Humans Apart)

: 어떠한 사용자가 실제 사람인지 컴퓨터 프로그램인지를 구별하기 위해 사용. 사람은 구별할 수 있지만 컴퓨터는 구별하기 힘들게 의도적으로 비틀거나 덧칠한 그림을 주고 그 그림에 쓰여 있는 내용을 물어보는 방법이 자주 사용. Captcha 이미지상의 숫자/문자가 아니라면 해당 요청을 거부하는 것.

 

2-3. 동일출처원칙

: 동일 출처(same-origin) 에서만 스크립트를 이용하여 데이터(DOM)를 접근을 허용하는 정책.

 

 

3. 소셜 로그인

3-1. 개념

: 인증(Authentication) 및 권한(Authorization)을 기반으로 한다.

 

3-2. 탄생배경

: 인증과 권한에 대한것을 대형 소프트웨어 업체가 대신 담당하여 보안을 통해 신뢰성 보장을 모색하는 것에 착안. OAuth와 같은 것을 통해 인증방식 표준을 세움으로써 접근성을 향상시켰다.

 

3-3. 방식

  • Spring 라이브러리인 OAuth2를 이용(구글, 페이스북 등)
  • 직접구현(카카오, 네이버 등)

 

3-4. 과정

  • 로그인 서비스 제공 업체에서 클라이언트 ID를 받는다.
  • 요청 및 응답처리를 하는 과정에서 리다이렉트 경로(Redirect URI)를 설정한다.
  • 추가 동의 여부 확인 후 인가 코드 및 인증 정보(토큰)를 받는다.

'WebDev > 본과정' 카테고리의 다른 글

Spring Boot의 테스트와 깃 형상관리  (0) 2021.05.17
Log4j와 스프링 부트 기초  (0) 2021.05.17
스프링 시큐리티를 이용한 로그인  (0) 2021.05.17
카카오톡 소셜로그인  (0) 2021.05.17
Spring Security  (0) 2021.05.17