Spring interceptor๋ฅผ ํ™œ์šฉํ•œ ๋กœ๊ทธ์ธ ๋ฐ ์ธ๊ฐ€(Authorization)

2021. 12. 2. 15:08ใ†Spring

728x90

1. ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization) 

 

1๏ธโƒฃ ์ธ์ฆ(Authentication)

: ์‹œ์Šคํ…œ ์ ‘๊ทผ ์‹œ, ๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ 

ex) ๋กœ๊ทธ์ธ 

 

2๏ธโƒฃ ์ธ๊ฐ€(Authorization) 

: ์‹œ์Šคํ…œ ์ ‘๊ทผ ํ›„, ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ 

๊ถŒํ•œ์— ๋”ฐ๋ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์ด ์ œํ•œ๋จ 

ex) ์‚ฌ์šฉ์ž ๋“ฑ๊ธ‰ (์ผ๋ฐ˜/ vip/ ๊ด€๋ฆฌ์ž)

 

 

2. Spring MVC ๊ฒŒ์‹œํŒ์— ์ธ์ฆ, ๊ถŒํ•œ ์ถ”๊ฐ€

https://hyejin.tistory.com/276

 

Spring MVC ๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ (+ ํผ ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์ฆํ•˜๊ธฐ Validator)

https://hyejin.tistory.com/270?category=1022293 Spring MVC ๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ณ , ์˜ˆ์ „์— jsp๊ณต๋ถ€ํ•  ๋•Œ ๋งŒ๋“ค์—ˆ๋˜ jdbc ๊ฒŒ์‹œํŒ์„ ์‘์šฉํ•ด Spring MVC ๋ฒ„์ „์œผ๋กœ ๊ฒŒ์‹œํŒ..

hyejin.tistory.com

์—ฌ๊ธฐ๊นŒ์ง€ ์ง„ํ–‰๋œ Spring MVC ๊ฒŒ์‹œํŒ์— ๋Œ€ํ•ด์„œ 

์ธ์ฆ๊ณผ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์ด๋‹ค. 

 

โญ ์ธ์ฆ์— ๋Œ€ํ•ด์„œ๋Š” ๋กœ๊ทธ์ธ์ด๊ณ , ์ง€๊ธˆ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์ธํ•  ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋ผ ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”์„ ๋”ฐ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ADMIN_AD = "admin"๊ณผ ADMIN_PW = "1234"๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. 

 

โญ ์ธ๊ฐ€์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์šฉ์ž ๋ชฉ๋ก์€ ๋กœ๊ทธ์ธ์„ ํ•˜์ง€ ์•Š๊ณ ๋„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠน์ • ๊ธ€ ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ, ๋“ฑ๋ก์€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜์—ฌ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ๊ธฐ๋Šฅ์„ ์ œํ•œํ•  ์˜ˆ์ •์ด๋‹ค. 

 

 

3. Interceptor ๊ฐ์ฒด

๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด์„œ ์˜ˆ์ „์— ๊ณต๋ถ€ํ–ˆ๋˜ aop ๊ณตํ†ต๊ธฐ๋Šฅ aspect ํด๋ž˜์Šค๋กœ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ 

์Šคํ”„๋ง์—์„œ๋Š” ์ด๋ฅผ ์ข€ ๋” ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก Interceptor ๊ฐ์ฒด๋ฅผ ์ง€์›ํ•ด์ค€๋‹ค. 

 

Interceptor ํ๋ฆ„

 

- HandlerInterceptorAdapter์˜ 3๊ฐ€์ง€ ๋ฉ”์„œ๋“œ 

1๏ธโƒฃ preHandle 

: ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰ ์ „, ์ฆ‰ ์ปจํŠธ๋กค๋Ÿฌ๋กœ request ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ˆ˜ํ–‰ํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋ฆฌํ„ดํ•  ๋•Œ true์ด๋ฉด ์ปจํŠธ๋กค๋Ÿฌ uri๋กœ ๊ฐ€๊ณ , false์ด๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ์š”์ฒญ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. 

 

2๏ธโƒฃ postHandle 

: ์ปจํŠธ๋กค๋Ÿฌ(ํ•ธ๋“ค๋Ÿฌ) ์‹คํ–‰ ํ•˜๊ณ  ๋‚˜์„œ ๋ทฐ ์‹คํ–‰ ์ „, ์ฆ‰ ์ปจํŠธ๋กค๋Ÿฌ์˜ ํ•ธ๋“ค๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜ return ๋˜๊ณ , ๋ทฐ ํ™”๋ฉด์„ response ๋˜๊ธฐ ์ง์ „์— postHandle ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

 

3๏ธโƒฃ afterCompletion 

: ๋ทฐ ํ™”๋ฉด์„ response ๋๋‚œ ๋’ค์— ์ˆ˜ํ–‰ํ•œ๋‹ค. 

 

 

4. Interceptor ํด๋ž˜์Šค ์ƒ์„ฑ  ๋ฐ Spring ์„ค์ • ํŒŒ์ผ์— ๋“ฑ๋ก 

 

1๏ธโƒฃ LoginInterceptor

 

2๏ธโƒฃ servlet-context.xml 

LoginInterceptor๋กœ ์ž‘์„ฑํ•œ  interceptor ํด๋ž˜์Šค์„ ๋นˆ ์ƒ์„ฑํ•ด์ฃผ๊ณ , 

<interceptors> ํƒœ๊ทธ ์•ˆ์— interceptor ๋“ฑ๋ก ๋ฐ ์„ค์ •ํ•ด์ค€๋‹ค.

(์ด๋•Œ <interceptors> ํƒœ๊ทธ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ <interceptor> ๋“ฑ๋ก ๊ฐ€๋Šฅํ•˜๋‹ค.)

 

๊ทธ๋ฆฌ๊ณ  <mapping> ํƒœ๊ทธ์— path์—๋Š” interceptor ํ•  request mapping ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ๋“ฑ๋กํ•œ๋‹ค. 

์ง€๊ธˆ์€ list.do๋งŒ ๋กœ๊ทธ์ธ ์œ ๋ฌด์— ์ƒ๊ด€์—†์ด ๋ณด์—ฌ์งˆ ์˜ˆ์ •์ด๊ธฐ ๋•Œ๋ฌธ์— <exclude-mapping>ํƒœ๊ทธ๋กœ list.do๋ฅผ ์ œ์™ธํ•ด์ค€๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  <beans:ref> ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ์–ด๋–ค interceptor๋ฅผ ์„ค์ •ํ• ์ง€ ๋“ฑ๋กํ•ด์ค€๋‹ค. 

 

 

5. UserController ์ž‘์„ฑ ๋ฐ ๋กœ๊ทธ์ธ ํ™”๋ฉด ์ƒ์„ฑ 

1๏ธโƒฃ login.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
	<div class="container">
		<h2 class="text-center">๋กœ๊ทธ์ธ</h2>
		<hr>
		<form class="text-center" action="loginOk" method="post">
			<div class="form-group">
				<label>id : </label>
				<input name="id" required="required"/> 
			</div>
			
			<div class="form-group">
				<label>pw: </label>
				<input name="pw" required="required"/>
			</div>
			
			<div class="btn-group">
				<input type="submit" value="login">
			</div>
		</form>
	</div>
</body>
</html>

 

2๏ธโƒฃ logout.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>
<script type="text/javascript">
	alert("๋กœ๊ทธ์•„์›ƒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!");
	location.href = "${pageContext.request.contextPath }/board/list.do";
</script>
</head>
<body>

</body>
</html>

3๏ธโƒฃ logfail.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>
<script type="text/javascript">
	alert("๋กœ๊ทธ์ธ ์‹คํŒจ!");
	history.back();
</script>
</head>
<body>

</body>
</html>

4๏ธโƒฃ UserController.java

login() ๋ฉ”์„œ๋“œ๋Š” ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ๋„์›Œ์ฃผ๋Š” ํ•ธ๋“ค๋Ÿฌ์ด๋‹ค. 

loginOk() ๋ฉ”์„œ๋“œ๋Š” ๋กœ๊ทธ์ธ ํผ์—์„œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋™์ž‘ํ•œ๋‹ค. 

๊ธฐ์กด์— ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋ฉด ์šฐ์„  ์ง€์›Œ์ฃผ๊ณ , ๋‹ค์‹œ session์— ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. 

 

๋งŒ์•ฝ ์•„์ด๋””์™€ ๋น„๋ฒˆ ์ž…๋ ฅ์„ ์ž˜๋ชปํ–ˆ๋‹ค๋ฉด logfail.jsp๋กœ ์ด๋™ํ•œ๋‹ค.

๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด ๊ฒŒ์‹œํŒ ๋ชฉ๋ก list.do๋กœ redirect ํ•œ๋‹ค. 

 

๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ๊นŒ๋จน๊ณ  ๊ตฌํ˜„ ๋ชปํ–ˆ๋Š”๋ฐ ๊ฒฝ๋กœ๋ฅผ user/logout ์œผ๋กœ ํ•ด์ฃผ๋ฉด ์„ธ์…˜์— ์ €์žฅ๋˜์–ด์žˆ๋˜ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ ,

๋‹ค์‹œ ๋ชฉ๋ก์œผ๋กœ redirect ํ•œ๋‹ค. (๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ชฉ๋ก์€ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—)

 

5๏ธโƒฃ ๊ฒฐ๊ณผ ํ™”๋ฉด 

๋กœ๊ทธ์ธ ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž - list.do 

 

ํŠน์ • ๊ธ€ ์กฐํšŒ๋ฅผ ์œ„ํ•ด ์ œ๋ชฉ์„ ํด๋ฆญํ•˜๋ฉด ๋กœ๊ทธ์ธํ•˜๋ผ๋Š” ์ฐฝ์„ ๋ณด๊ฒŒ ๋œ๋‹ค.
์•„์ด๋”” ๋น„๋ฒˆ์„ ์ž˜๋ชป ์ž…๋ ฅํ•˜๋ฉด ์•Œ๋ฆผ์ฐฝ์„ ๋ฐ›๊ฒŒ ๋˜๊ณ  ๋‹ค์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค. 
์ €์žฅ๋œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ชฉ๋ก ์กฐํšŒ, ์ˆ˜์ •,์‚ญ์ œ ,๋“ฑ๋ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

๋งŒ์•ฝ ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฉ๋ก์—์„œ Validation practice์ œ๋ชฉ์˜ ๊ธ€์„ ์กฐํšŒํ•˜๋ ค๊ณ  ํด๋ฆญํ–ˆ๋‹ค๋ฉด 

๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋ณด๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธํ•˜๊ณ  ๋‚˜๋ฉด 

๋ฐ”๋กœ ๋ชฉ๋ก ์กฐํšŒ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ณด๋ ค๊ณ  ํ–ˆ๋˜ Validation practice ๊ธ€์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ด๋Š” 

interceptor์—์„œ prehandle() ๋ฉ”์„œ๋“œ์—์„œ 

request.getResultURL().toString() + "?" + request.getQueryString() ์„ํ†ตํ•ด ์ง์ „ url์„ session์— ์ €์žฅํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  UserController์—์„œ ์„ธ์…˜์— ์ €์žฅ๋œ ์ง์ „ url์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น url๋กœ ์ด๋™ํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ๋ชฉ๋ก์œผ๋กœ ์ด๋™ํ•œ๋‹ค. 

 

728x90