본문 바로가기
JAVA

[JAVA] SSO 인증 심플 구현 - 예제

by ssollacc 2023. 8. 7.
728x90

<요구사항>

A사이트에서 로그인을 하고 A사이트에서 특정 버튼/메뉴 클릭 시, B사이트 (메인)페이지로 이동(B사이트 자동 로그인)

 

<구현방법>

1. A사이트에서 B사이트 호출() 시 헤더에 특정 name으로 userId를 담아 보냄

2. B사이트에서 헤더 name을 확인하고 value(userId)를 B사이트 DB에서 조회

3. DB 조회 후 userId가 존재한다면 로그인 처리 후 메인화면으로 이동

없다면 얼롯창 안내 후 B사이트 로그인 페이지로 이동

 

<유의사항>

1. B사이트 호출 URL 지정(약속)해야 함

2. 호출 시  헤더 name 지정(약속)해야 함

3. dispatcher-servlet.xml에서 호출 URL 세션 및 로그인 예외 처리

 

<구현>
1. A사이트에서 B사이트 요청 jsp 스크립트

  <script>
 //  사이트로 요청을 보냄
    fetch('http://localhost:8080//login/ssoLogin.do', { 
      method: 'GET',
      headers: {
        'ssoId': 'ssollacc' // B사이트 DB에 있는 아이디
      }
    })
    
    .then(response => {
      // 응답 처리
      if (response.ok) {
        // 응답이 성공적인 경우 (200-299 범위의 상태 코드)
        // 사이트로 로그인이 성공했으며, main 페이지로 이동하거나 응답에 따른 처리를 수행.
        window.location.href = 'http://localhost:8080/main/main.do'; // main 페이지로 이동
      } else {
        // 응답이 실패한 경우 (300 이상 또는 에러 상태 코드)
        // 실패 처리 수행.
        console.error('사이트 요청에 실패했습니다.');
      }
    })
    .catch(error => {
      // 네트워크 오류 등의 예외 처리
      console.error('요청 중 오류가 발생했습니다.', error);
    });
    
</script>

 

2. B사이트에서 요청 받음, java 단에서 처리

@RequestMapping(value = "ssoLogin", method = RequestMethod.GET)
	public String ssoLogin(HttpServletRequest request, HttpServletResponse response, Model model) {
		
		logger.debug("request.getHeader>>>>>> (){}", request.getHeader("ssoId"));
		
		String url ="/common/error404"; //에러 페이지
		
		if(!request.getHeader("ssoId").isEmpty()){ //헤더에 약속한 name이 있는가?
			
			url ="redirect:/login/checkLogin.do"; //있다면 기존 로그인 로직 태움
		
		}
		
		return url;
	}

+ 기존 로그인 로직에 분기 추가

	if(!StringUtils.isEmpty(request.getHeader("ssoid"))){

			userId = request.getHeader("ssoid");
			ssoYn = "Y";
			
			logger.debug("ssoid  ssoid  ssoid userId?>>>>>> ()"+userId);
		}
728x90

댓글