20221025-64 Spring(7) security 설정/ 로그인창/암호화/Spring Boot

공현지·2022년 10월 25일
0

spring

목록 보기
3/30

och09_security1

로그인-기본 🔐

Spring Security

  • Spring MVC 기반 애플리케이션 인증(Authentication)과 인가(Authorization) 기능 지원하는 보안 프레임워크
    • Authentication(인증)
            사용자가 누구인지 확인
    • Authorization(인가)
           사용자가 요청을 실행할수 있는 권한이 있는지
      확인하는 절차
    • Spring MVC 기반 애플리케이션 보안 적용에서의 표준과도 같음
  • Spring 지원 Interceptor, Servlet Filter를 통해 보안 기능 구현도 가능하지만 보안 대부분의 기능을 Spring Security에서 안정적으로 지원하기 때문에 Spring Security 이용을 권장함

security 초기값 세팅

pom.xml안에 내용 pox.security 내용으로 바꿔주고
web.xml에서 한글처리도 먼저 해주기

<!-- security셋팅해줌 -->
<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml
		             /WEB-INF/spring/appServlet/security-context.xml
		</param-value>              
		
	</context-param>
	
<!-- 필터체인을 걸어주면 체크해줌  -->
	<filter> 
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

bean파일 만들때 security-context.xml파일먼저 생성해주기
bean하고 security 체크 꼭하기 **

security-context.xml

security:intercept-url가 스프링에서 만들어놓은 로그인창 띄어줌 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">


		<security:http auto-config="true">
                 security:intercept-url가 스프링에서 만들어놓은 로그인창 띄어줌 
		      <security:intercept-url pattern="/login.html"  access="ROLE_USER" />  
                                         <!-- /login.html 로 들어가면 USE만 접근권한 -->
		      <security:intercept-url pattern="/welcom.html"  access="ROLE_ADMIN" />
                                      <!-- /welcom.html 로 들어가면 ADMIN만 접근권한 -->
		</security:http>
  
		<security:authentication-manager><!-- 인증관리자 -->
		    <security:authentication-provider> <!-- 인증제공자 -->
		       <security:user-service> <!-- 서비스를 누구에게 줄거냐  -->
		       <security:user name="user"  password="123"   authorities="ROLE_USER"/> 
                 <!-- user, 비번 123 으로 들어오면 권한은 ROLE_USER 준다 -->
		      <security:user name="admin"  password="123"  authorities="ROLE_ADMIN"/>
                 <!-- admin, 비번 123 으로 들어오면 권한은 ROLE_ADMIN 준다 -->
		       </security:user-service>
		    
		    </security:authentication-provider>
		
		
		</security:authentication-manager>

</beans>


homeController.java

@RequestMapping("/login.html")
	private String login(Model model) {
			logger.info("welcon login.html");
			return "security/login";
	}
	@RequestMapping("/welcom.html")
	private String welcom(Model model) {
			logger.info("welcom welcom.html");
			return "security/welcom";
	}
	
	

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

 <h1>login 성공</h1>

</body>
</html>

welcom.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1> welcom성공</h1>

</body>
</html>


🔽/login.html 실행시키면 스프링에서 제공하는 아이디 창 실행됨

❌security-context.xml에서 설정해둔 번호 입력안해주면 에러 뜸

⭕user / 123 입력해주면 login 성공 으로 들어감

🔽그다음 /welcom.html 실행시키면 403오류 뜸 --user로 로그인 되어있기 때문

🔽다시 들어갔다 나와서 /welcom.html 실행시키고
admin /123 입력하면 실행됨


och09_security2 🔐

로그인창 바꾸기

web.xml설정 pom.xml 설정 (위랑 똑같이)
loginForm.html 걸어주면 로그인창 꾸밀수 있고 안걸어주면 기본으로 제공하는 로그인창 뜸 .

security-context.xml 셋팅

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">

	<security:http auto-config="true"><!-- 로그인페이지 지정 -->     <!-- 로그인실패하는 페이지 에라를 달아서보냄  -->          로그인창 꾸밀수 있는 화면 
		<security:form-login login-page="/loginForm.html"  authentication-failure-url="/loginForm.html?error"  /> 
	    <security:intercept-url pattern="/login.html" access="ROLE_USER"  />
	    <security:intercept-url pattern="/welcom.html" access="ROLE_ADMIN"  />
	</security:http>
    
   <security:authentication-manager> <!--   인증관리자  -->
		    <security:authentication-provider> <!-- 인증제공자 -->
		       <security:user-service> <!-- 서비스를 누구에게 줄거냐 		        -->
		       <security:user name="user"  password="123"   authorities="ROLE_USER"/>  <!-- user, 비번 123 으로 들어오면 권한은 ROLE_USER 준다 -->
		      <security:user name="admin"  password="123"  authorities="ROLE_ADMIN,ROLE_USER"/> <!-- admin, 비번 123 으로 들어오면 권한은 둘다준다 -->
		       </security:user-service>
		    
		    </security:authentication-provider>
		
		
		</security:authentication-manager>

</beans>


HomeController.java

   //user로그인 완료시 
@RequestMapping("/login.html")
	public String login(Model model) {
		System.out.println("HomeController login.html start");
		return "security/login";
		
		
	}  //user,admin로그인 완료시 
	@RequestMapping("/welcom.html")
	public String welcom(Model model) {
		System.out.println("HomeController welcom.html start");
		return "security/welcom";
		
		
	} //로그인 화면
	@RequestMapping("/loginForm.html")
	public String loginForm(Model model) {
		System.out.println("HomeController loginForm.html start");
		return "security/loginForm";
		
		
	}
	


welcom.jsp

<body>
 <h1>welcom성공</h1>
</body>

login jsp

<body>

<h1>login 성공</h1>
<c:if test="${not empty pageContext.request.userPrincipal }">
     ${pageContext.request.userPrincipal } //내부정보토큰
      <p> is Log-In</p>
</c:if> 
 <c:if test="${empty pageContext.request.userPrincipal }">
  <p> is Log-Out</p>
</c:if> 
                        //내부정보토큰을 쪼개서 사용가능
 	USER ID : ${pageContext.request.userPrincipal.name }
  <br/>
 <a href="${pageContext.request.contextPath }/j_spring_security_logout">Log Out</a>
/j_spring_security_logout 을 눌려주면 세션 해제해줌
  <!-- 공식처럼 써줘야함 -->
</body>

loginForm.jsp

➰ 내가 만드는 로그인창

여기서 style주면 로그인 창 꾸미기 가능
j_username /j_password /j_spring_security_check / --> reserved word(예약어)

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>내가 만드는 security login form </h1>
						<!-- j_로 시작하는것은 공식 스프링에서 제공되는  예약어 -->
	<c:url value="j_spring_security_check" var="loginUrl"></c:url>
	<h5>loginUrl : ${loginUrl }</h5>
	
	<form action="${loginUrl }" method="post">
			<c:if test="${param.err != null }">
					<p>
							LogIn Error! <br />
							<c:if test="${SPRING_SECURITY_LAST_EXCEPTION != NULL }">
							     message : <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />							     
							</c:if>
			 		</p>
			</c:if>          <!-- j_로 시작하는것은 스프링에서 제공되는  예약어 /강제 -->                                         
			ID  : <input type="text" name="j_username"><br />
			PW : <input type="text" name="j_password"><br />
			<input type="submit" value="LOGIN"> <br />
			
	</form>
</body>
</html>


▶j_username ,j_password 강제임

  안해도 되지만 한번 확인

    

🔽user 123 로 /loginForm.html 들어가보기

🔽아이디 비번 틀리면 에러메세지 띄여줌

🔽 아이디 비번 맞으면 로그인 성공

🔽user 아이디 성공된상태에서 login.html들어가면 들어가짐

🔽user 아이디 성공된상태에서 welcom.html들어가면 오류남
권한이 없기때문

🔽admin 123 로 들어가면 login.html 성공하고

🔽admin 123 로 들어가도 welcom.html 성공함


암호화 처리 🔑🔓

  • SecurityConfig 에서 BCryptPasswordEncoder를 Bean으로 등록
  • SecurityController에서 암호화 하고자 한다면 아래 적용
    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;
  • 코딩구현
    String encPassword = bCryptPasswordEncoder.encode(rawPassword)

정보를 노출시키지 않기 위해 특정 알고리즘을 이용하여 암호화된 형태로 변형😎

  • 암호화 유
    • 대칭 암호화(비공개키) :
      발신자와 수신자가 동일한 개인 암호화 키를 사용하여 암호화된 메시지를 디코딩하고 인코딩(DES,SEED,AES,Aria..) , 비밀키
    • 비대칭 암호화(공개키):
      개인정보를 보호하기 위해 대칭 암호화보다는 더 고차원적이고 안전한 방법
      공개키는 발신자와 수신자 모두 동일한 키를 가지고 있지만 개인키는 각 당사자가 고유한 키
      (RSA,Rabin, ELGamal )
    • 해쉬(Hash) :
      임의길이를 해시함수(해시 알고리즘)를 이용하여 고정된 길이의 암호화된 문자열
      MD5, SHA-1, HAS-180은 사용하면 안된다.
      SHA-256, SHA-512등을 사용하기를 권고함.
      참고로 SHA-512가 보안이 더 좋음
    • bcrypt :
      패스워드를 위해 탄생해서 아주 강력한 해시 알고리즘이 적용됨.
      Spring security에서 사용

Spring Boot 🍧

스프링부트 최신 버전 :2.7.5

스프링 부트에서는 여러가지 뷰가 사용 가능하다.

  • FreeMarker
  • Groovy
  • Thymeleaf
  • Velocity
  • JSP

Maven 방식 & Gradel방식🍧
레가시 부트 둘다 지원 / 스프링부트에만 있음
Jar & war 🍧

oBootHello (Gradel ,Jar /Thymeleaf 뷰 설정)


spring web -> 뷰를 개발할때

🔼체크하면 알아서 다운로드 되어짐

--> 환경파일임 (건들지말기)

기본 패키지 생성시키기

Prefix --> templates
suffix -->.html
templates --> view랑 같음
build.gradle --> pom.xml 랑 같음.

1application.properties

Key-Value 형식으로 지정해서 처리
server.port=8381

2HelloController.java

 package com.oracle.oBootHello.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
	//로거 사용 가능 
 private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
 
 //Prefix --> templates
 //suffix -->.html 
 @RequestMapping("hello")
 public String hello(Model model) {
	  logger.info("HelloController start. . . ");
	  model.addAttribute("parameter", "bootstart.  .  . ");

	  return "hello";
 }
}
     
       
       

3 hello.html

걸어두면 타임리프 기능 쓸수 있음
html xml:th="http://www.thymeleaf.org"

 <!DOCTYPE html>
 <!--  걸어두면 타임리프 기능 쓸수 있음  -->
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
			<h1>hello.html</h1>
			<p th:text="안녕+${parameter}">
              //타임리프에 텍스트 넣어줌 
</body>
</html>
        
      
     
        

🔽localhost:8381/hello 입력시

3 index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 <h1>나 index야 </h1>
 <a href="/hello">hello</a>
  //hello 누르면 hello.jsp로 넘어감 
</body>
</html>
        

🔽localhost:8381 입력시

✅ spring boot mvc 흐름


위에랑 똑같은거 더 쉽게 설명 🔽




✅ @RequestBody / @ResponseBody 어노테이션 이란?

스프링 프레임워크에서 비동기 통신, 즉 API 통신을 구현하기 위해 @RequestBody와 @ResponseBody 어노테이션을 사용한다.

  • 클라이언트 -> 서버 요청 : @RequestBody

  • 서버 -> 클라이언트 응답 : @ResponseBody

    @RequestBody

    json 기반의 HTTP Body를 자바 객체로 변환

    @ResponseBody

    자바 객체를 json 기반의 HTTP Body로 변환

    Emp.java

    package com.oracle.oBootHello.domain;
    //객체
    public class Emp {
    	private String empno;
    	private String ename;
    	public String getEmpno() {
    		return empno;
    	}
    	public void setEmpno(String empno) {
    		this.empno = empno;
    	}
    	public String getEname() {
    		return ename;
    	}
    	public void setEname(String ename) {
    		this.ename = ename;
    	}
    	
    	

}

HelloController.java (사용반환형이 string)

   @ResponseBody 
   @GetMapping("ajaxString")
   public String ajaxString(@RequestParam("ajaxName")String aNAME) {
	  System.out.println("HelloController ajaxString aNAME ->"+aNAME);
	   return aNAME;
	   
   }

HelloController.java (사용 반환형이 객체 타입->json)

	
  @ResponseBody  
  @GetMapping("ajaxEmp")
  public Emp ajaxEmp(@RequestParam("empno") String empno, @RequestParam("ename") String ename ) {
	  System.out.println(" HelloController ajaxEmp empno->  "+empno);
	  logger.info("ename-->{}", ename);
	  Emp emp = new Emp();
	  emp.setEmpno(empno);
	  emp.setEname(ename);
	  
	  return emp;
  }
  
  
    
        
        

실행시 입력해주면 화면 뜸
객체 값을 반환한것은 데이터가 JSON 형태로 페이지에 출력된다.

자바기본

collection
1 List
2 Set
3 Map

list set map 특징

    

0개의 댓글