Spring Security + JWT(2)

shinhyocheol·2021년 6월 30일
0

스프링 시큐리티 설정을 통해 기본적인 설정 및 필터 관련 설정을 한다. 이때 필터에서는 아래에서 후술할 JWT 프로바이더 클래스의 각 기능들을 사용자 인증작업을 진행한다.

자 위 사진을 보면 알겠지만 로그인, 회원가입, 테스트용을 제외하고는 접근권한을 걸어놓았다.

이제 API를 통해 테스트를 진행해보자.

우선 사용자를 검증하기 위해서는 기본적으로 DB에 데이터가 있어야 하므로 데이터를 등록하는 API부터 만들어보자.

요런식으로 데이터를 등록하는 API를 만들었다.

우선 테이블에는 아무것도 존재하지 않는다. Postman을 통해 데이터를 등록해보자.

자 우선 터미널로 테이블을 확인 해본 결과 정상적으로 저장됐다.

이제 생성(로그인) API를 통해 토큰이 잘 생성 되는지 확인해보자.

validateParams : BaseController에 작성되어있다보니 헷갈리시는 분들이 계셔서 따로 코드를 추가하였습니다.

protected Map<String, Object> validateParams(HttpServletRequest request) {
		Map<String, Object> resultMap = new HashMap<String, Object>();
		Map<String, String[]> reqMap = request.getParameterMap();
		@SuppressWarnings("rawtypes")

 	Enumeration reqEnum = request.getParameterNames();
    
	for(int i = 0; i < reqMap.size(); i++) {
		String key = (String)reqEnum.nextElement();
		
		if(reqMap.get(key).length > 1) {
			String[] value = reqMap.get(key);
			
			for(String s : value) {
				if(SqlUtil.injectionCheck(s)) {
					return null;
				}
			} 
			List<String> valueList = Arrays.asList(value);
			resultMap.put(key, valueList);
		} else {
			String value = ((String[])reqMap.get(key))[0];
			
			if(!SqlUtil.injectionCheck(value)) {
				resultMap.put(key, value);
			} else {
				return null;
			}
		}
	}
	return resultMap;
}

자 어떤식으로 진행되는지는 이전글에서 서술했으니 바로 테스트를 진행해보자.

내가 입력한 정보에 대한 데이터들과 x-access-token(JWT를 통해 생성한 값) 이 고스란히 응답되는 것을 확인 해볼 수 있다.

이제 검증을 해보자.

그전에 로그인 시 받은 데이터 중 authority_level 이라는 데이터가 있을 것이다. 현재 클라이언트의 레벨은 1 이다.

그렇다면 테스트 API를 작성하고 레벨을 2 혹은 3의 클라이언트만 접근 가능하게 설정을 수정해보자.

자 이렇게 할 시 과연 "인증 성공!!"이라는 메시지가 올 것인가??

이렇게 접근이 거부가 된다. 자 다시 수정을 해보자

이런식으로 인증이 성공했으므로 API 접근과 동시에 통신이 성공한 것이다.

요런식으로 스프링 시큐리티와 JWT를 적절하게 연결시켜 사용자 인증 프로세스를
만들었다. 물론 내가 작성한 방식이 정답은 절대 아니다. 나도 처음 작업해보는 것이라
많이 서툴렀고, 오류도 많았었다. 그래도 혼자서 해봤다는 것이 의미가 있었고, 나름 의도한대로 동작이 되는 걸 보니 재밌고 뿌듯한 작업이였다!

profile
놀고싶다

2개의 댓글

comment-user-thumbnail
2021년 9월 23일

안녕하세요
코딩 공부하는 사람으로써 좋은 글 감사합니다.
다름이 아니라 궁금한 점이 있어서 댓글 달아봅니다.
위에서 2번째 사진에 validateParams를 만드신거같은데 그 것에 관한 설명이 없어서 진행 중에 막혀버렸습니다. 혹시라도 설명을 해주실 수 있으실까요?

1개의 답글