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 |
최근댓글