2021. 12. 2. 15:08ใSpring
1. ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ(Authorization)
1๏ธโฃ ์ธ์ฆ(Authentication)
: ์์คํ ์ ๊ทผ ์, ๋ฑ๋ก๋ ์ฌ์ฉ์์ธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๊ฒ
ex) ๋ก๊ทธ์ธ
2๏ธโฃ ์ธ๊ฐ(Authorization)
: ์์คํ ์ ๊ทผ ํ, ์ธ์ฆ๋ ์ฌ์ฉ์์๊ฒ ๊ถํ์ ๋ถ์ฌํ๋ ๊ฒ
๊ถํ์ ๋ฐ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ด ์ ํ๋จ
ex) ์ฌ์ฉ์ ๋ฑ๊ธ (์ผ๋ฐ/ vip/ ๊ด๋ฆฌ์)
2. Spring MVC ๊ฒ์ํ์ ์ธ์ฆ, ๊ถํ ์ถ๊ฐ
https://hyejin.tistory.com/276
์ฌ๊ธฐ๊น์ง ์งํ๋ Spring MVC ๊ฒ์ํ์ ๋ํด์
์ธ์ฆ๊ณผ ๊ถํ์ ์ถ๊ฐํ ๊ฒ์ด๋ค.
โญ ์ธ์ฆ์ ๋ํด์๋ ๋ก๊ทธ์ธ์ด๊ณ , ์ง๊ธ์ ๊ฐ๋จํ๊ฒ ํ์ธํ ์ฉ๋๋ก ์ฌ์ฉํ ์์ ์ด๋ผ ์ฌ์ฉ์ ํ ์ด๋ธ์ ๋ฐ๋ก ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ADMIN_AD = "admin"๊ณผ ADMIN_PW = "1234"๋ก ํ ์คํธ๋ฅผ ์งํํ ๊ฒ์ด๋ค.
โญ ์ธ๊ฐ์ ๋ํด์๋ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๋ก๊ทธ์ธ์ ํ์ง ์๊ณ ๋ ์กฐํํ ์ ์์ง๋ง, ํน์ ๊ธ ์กฐํ, ์์ , ์ญ์ , ๋ฑ๋ก์ ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ๊ฐ๋ฅํ๋๋ก ํ์ฌ ๋ก๊ทธ์ธํ์ง ์์ ์ฌ์ฉ์์ ๋ํด ๊ธฐ๋ฅ์ ์ ํํ ์์ ์ด๋ค.
3. Interceptor ๊ฐ์ฒด
๋ก๊ทธ์ธ ์ฒ๋ฆฌ์ ๋ํด์ ์์ ์ ๊ณต๋ถํ๋ aop ๊ณตํต๊ธฐ๋ฅ aspect ํด๋์ค๋ก ์์ฑํ ์๋ ์๊ฒ ์ง๋ง
์คํ๋ง์์๋ ์ด๋ฅผ ์ข ๋ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก 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๏ธโฃ ๊ฒฐ๊ณผ ํ๋ฉด
๋ง์ฝ ๋ก๊ทธ์ธํ์ง ์์ ์ฌ์ฉ์๊ฐ ๋ชฉ๋ก์์ Validation practice์ ๋ชฉ์ ๊ธ์ ์กฐํํ๋ ค๊ณ ํด๋ฆญํ๋ค๋ฉด
๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ก๊ทธ์ธํ๊ณ ๋๋ฉด
๋ฐ๋ก ๋ชฉ๋ก ์กฐํ๊ฐ ์๋๋ผ ๋ณด๋ ค๊ณ ํ๋ Validation practice ๊ธ์ ์กฐํํ ์ ์๋ค.
์ด๋
interceptor์์ prehandle() ๋ฉ์๋์์
request.getResultURL().toString() + "?" + request.getQueryString() ์ํตํด ์ง์ url์ session์ ์ ์ฅํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ UserController์์ ์ธ์ ์ ์ ์ฅ๋ ์ง์ url์ด ์๋ค๋ฉด ํด๋น url๋ก ์ด๋ํ๊ณ , ์๋๋ฉด ๋ชฉ๋ก์ผ๋ก ์ด๋ํ๋ค.