AWS의 ec2와 jenkins, github를 연동하여 

프로젝트 소스를 git push 했을 때 배포할 수 있도록 자동배포 환경을 만들어보겠습니다.

 

ec2, jenkins, git의 연동 방법은 추후에 자세히 작성하도록 하겠습니다.

 

대략적인 흐름입니다.(이미 ec2와 jenkins, github가 연동되어 있다고 가정) 

 

더보기

1. 관리자가 git push를 진행한다.
2. github가 push를 감지하여 Jenkins에 WebHoock을 보낸다.
(github ->Setting/Webhooks 에 설정했기 때문에)
3. Jenkins의 아이템(job)이 신호를 받는다.
4. job은 jenkins에서 설정한 git주소의 프로젝트 최신 소스를 받고 빌드하여 war를 만든다.
5. ssh 통신으로 remote 서버에 war 파일을 전송(jenkins에서 tomcat전송을 설정)
6. jenkins의 job 설정에서 Build -> invoke top-level Maven targets에서 작성한 스크립트로 기존 war 파일을 방금 빌드한 war 파일로 교체한다.(Goals )

 

홈페이지에는

홈페이지를 이용하는 사용자와, 홈페이지를 관리하는 관리자가 있습니다.

해킹을 시도하려는 해커가 admin 페이지로 갈 수 있는 url을 알고 있다면

해당 url로 접속하여 admin의 권한을 얻어 자유롭게 홈페이지를 활보 할 수 있습니다.

 

이럴 때 사용자의 권한을 확인하여 

해당 사용자가 관리자의 권한을 가지고 있다면 정상적으로 admin 페이지로 접속 할 수 있도록 이동하고,

그렇지 않다면 interceptor를 이용하여 login 페이지로 이동 시키도록 하겠습니다.

 

interceptor를 실행하는 controller를 만들기 위해 

interceptor 패키지를 만든 후 AdminInterceptor.java를 작성합니다.

 

package net.eduSample.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import net.eduSample.common.vo.UserVO;

public class AdminInterceptor extends HandlerInterceptorAdapter {

	 @Override
	 public boolean preHandle(HttpServletRequest req,
	    HttpServletResponse res, Object obj) throws Exception {
	  
	  HttpSession session = req.getSession();
	  UserVO user = (UserVO)session.getAttribute("user");
	  
	  if(user == null || user.getVerify() != 9) {
	   res.sendRedirect("/login/form");
	   return false;
	  }
	  
	  return true;
	 }
}

 

코드를 보면 AdminInterceptor는 HandlerInterceptorAdapter를 상속받는데

컨트롤러를 실행하기 전에 관리자 인지 확인하고 싶기에

preHandle를 override 했습니다.

(컨트롤러 실행 후 확인하려면 postHandle 사용!)

 

이제 현재 접속되어 있는 사용자의 세션(user)을 불러와서 

UserVO형태로 형변환하여 user 에 저장합니다.

이제 세션을 불러왔으니 if문으로 세션(user)에 값이 없거나 권한 번호가 관리자의 번호가 아니라면

로그인 페이지로 넘겨줄것입니다.

 

Contorller를 작성했으니 interceptor controller를 인식 할 수 있도록 추가해주는데

web쪽인 Dispatcher-servlet.xml에서 설정해주어야 합니다.

 

<!-- Dispatcher-servlet.xml -->

	<bean id="AdminInterceptor" class="net.eduSample.interceptor.AdminInterceptor" />

	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/admin/**" />
			<ref bean="AdminInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

 

bean 태그를 이용해 빈의 이름과 interceptor를 실행하는 controller의 위치를 작성합니다.

그리고 interceptor태그를 이용하여 경로와 bean의 id를 불러와서

경로와 bean을 등록합니다.

 

일반 사용자가 접속

 

 

 

url로 admin page로 접속

 

 

 

Interceptor로 인해 login 페이지로 Redirect

해당 포스팅은 다음을 참조했습니다.

https://baked-corn.tistory.com/29

 

OAuth2.0

OAuth2.0 안녕하세요. 오늘은 우리가 여러 웹서비스들을 이용할 때 자주 사용되는 요소 중 하나인 OAuth2.0에 대해 살펴보는 시간을 갖도록 하겠습니다. OAuth2.0이란 각종 웹, 모바일 어플리케이션에��

baked-corn.tistory.com

 

용어를 우선 정리하도록 하겠습니다.

 

용어 의미
Client 사용자가 사용하려는 우리가 만든 서비스
Resource Server 구글/페이스북같은 oauth 제공자, 어떤 사람의 자원(Resource)를 가지고 있음. 
Resource Onwer client의 서비스를 이용하는 사람, 이미 구글, 페이스북등에 가입된 사람으로 Resource server의 Resource owner이기 때문에 Resource owner라고 함.

 

 

1. 우리가 만든 Client가 Resource Server의 API를 사용한다고 Resource Server에 등록을 해야합니다(구글, 페이스북 등등..)

2. 그렇다면 Resource Server는 이 Client를 식별할 수 있는 Client ID와 Client Secret을 발급합니다.

3. 이 후 Resource Owner가 우리가 만든 Client에서 Google 계정으로 로그인을 통해 로그인 요청을 합니다

4. 구글에서는 로그인이 안되어있으면 로그인을 할 수 있는 화면을 보여주고, 로그인이 되어있으면 "내가 만든 웹사이트에서 너의 구글계정에 있는 어떤 정보(API정보)를 가져다 쓴다는데 동의할거야?" 라고 구글이 동의를 구하는 화면을 보여준다.

5. 사용자가 동의하면 구글은 바로 정보를 주지 않고 인증 코드를 웹사이트에 줍니다.

6. 인증코드를 받은 웹사이트에서는 기존에 웹서비스를 구글에 등록하면서 받은 client id(ID)와 client secret(PW), 그리고 인증코드를 보냅니다. (총 3개의 정보)

7. 그러면 구글이 올바른 클라이언트(웹사이트)의 요청이었음을 검증했기 때문에 access token을 줍니다.

8. 이제 사용자의 요청에 따라 구글 계정의 정보(API)가 필요하면 구글에 access token을 내밀면서 정보를 받아다가 쓸 수 있습니다.

+ Recent posts