본문 바로가기
Framework & Lib & API/스프링

[스프링 시큐리티] 자동로그인 remember-me 쿠키 생성 커스터마이징

by 코딩공장공장장 2021. 4. 18.

안녕하세요.

 

오늘은 스프링 시큐리티의 remember-me기능을 통해 자동로그인기능을 구현한 경우 

 

로그인 인증 권한과 remember-me 기능을 커스터마이징 해야한 상황에서 이슈 대응법에 대해 알아 보겠습니다.

 

로그인 인증 권한을 얻는 것에 대해서는 따로 설명하지 않고 remember-me 쿠키 생성에 관해서 알아보도록 하겠습니다.

 

로그인 인증 권한을 얻는 것은 너무 다양한 방법이 있고 개발자마다 다르게 설정하는 경우가 많아

 

구글링의 많은 소스들을 통해 자신의 프로젝트에 맞게끔 구현하는것을 추천드립니다. 

 

 

 

일단, 어떤 상황에서 이런 커스터마이징이 필요한지 예를 들어보겠습니다.

 

네이버 아이디로 로그인, 카카오톡으로 로그인, 페이스북으로 로그인 등 요즘 sns 로그인 기능을 구현한 

 

웹, 앱 프로젝트가 많이 있을 것입니다. 

 

이 경우, 네이버, 카카오톡, 페이스북 서버에서 로그인 성공했는지 실패했는지 알려주지만

 

단순히 알려주는것 뿐이기 때문에 인증이 성공됨을 파악했다면 그 이후 스프링 시큐리티를 통한 

 

권한 부여는 개발자가 직접해야합니다. 

 

권한부여과정은 생략하겠습니다.(구글링의 많은 소스를 참조하시기 바랍니다.)

 

 

 

만약 자동로그인 기능인 remember-me 쿠키를 사용하고 있다면 여기서 끝이 아닙니다. 

 

remember-me 쿠키를 생성해야합니다. 

 

 

 

 

이제 본격적으로 remember-me 쿠키를 직접 생성해보겠습니다. 

 

 

 

remember-me 쿠키가 어떻게 이루어져있는지 보겠습니다 .

 

base64(username + ":" + expirationTime + ":" +
md5Hex(username + ":" + expirationTime + ":" password + ":" + key))

 

username : 로그인 아이디

expirationTime : 쿠키유효기간(밀리세컨드 단위)

password : 비밀번호(DB에 암호화되어 있다면 암호화된 비밀번호로 사용)

key : remember-me 키 값

 

위와 같이 remember-me 쿠키는 base64와 md5Hex방식으로 인코딩 되어 이루어져있습니다. 

 

자신의 웹프로젝트에서 위의 변수값에 맞게 커스터마이징하면 remember-me쿠키를 생성할 수 있을 것입니다. 

 

아래 제가 구현한 코드를 참조하면 쉽게 이해할 수 있을 것입니다.

 

 

 		long tokenValidityTime = 14515200000L;
		long millis = System.currentTimeMillis()+tokenValidityTime;
			
		String target = "아이디:" + millis + ":" +org.apache.commons.codec.digest.DigestUtils.md5Hex("아이디:" + millis + ":비밀번호:rememberMe키값");
		    byte[] targetBytes = target.getBytes();
	        // Base64 인코딩 ///////////////////////////////////////////////////
	        Encoder encoder = Base64.getEncoder();
	        
	        // Encoder#encode(byte[] src) :: 바이트배열로 반환
	        byte[] encodedBytes = encoder.encode(targetBytes);
	        
	        String rememberCookie = new String(encodedBytes);
	        String rememberMeCookie = rememberCookie.replace("=", "");
	        
	        Cookie cookie = new Cookie("remember-me",rememberMeCookie);
	        cookie.setPath("/");
	        cookie.setHttpOnly(true);
	        cookie.setMaxAge(14515200);

 

참고로 유효기간은 6개월로 설정했고 

 

base64로 인코딩 하면 의도치 않게 = 이라는 값이 생길때도 있고 안생길때도 있어서

 

String rememberMeCookie = rememberCookie.replace("=", "") 코드를 통해

 

불필요하게 생긴 = 값을 없애주었습니다. 

반응형