JSP-보안
JavaServer 페이지 및 서블릿은 웹 개발자가 애플리케이션을 보호하기 위해 여러 메커니즘을 사용할 수 있도록합니다. 리소스는 응용 프로그램 배포 설명자에서 식별하고 역할을 할당하여 선언적으로 보호됩니다.
식별자 및 암호를 사용한 기본 인증부터 인증서를 사용한 정교한 인증에 이르기까지 여러 수준의 인증을 사용할 수 있습니다.
역할 기반 인증
서블릿 사양의 인증 메커니즘은 다음과 같은 기술을 사용합니다. role-based security. 아이디어는 사용자 수준에서 리소스를 제한하는 대신 역할을 만들고 역할별로 리소스를 제한하는 것입니다.
파일에서 다른 역할을 정의 할 수 있습니다. tomcat-users.xml, conf의 Tomcat 홈 디렉토리에 있습니다. 이 파일의 예는 다음과 같습니다.
<?xml version = '1.0' encoding = 'utf-8'?>
<tomcat-users>
<role rolename = "tomcat"/>
<role rolename = "role1"/>
<role rolename = "manager"/>
<role rolename = "admin"/>
<user username = "tomcat" password = "tomcat" roles = "tomcat"/>
<user username = "role1" password = "tomcat" roles = "role1"/>
<user username = "both" password = "tomcat" roles = "tomcat,role1"/>
<user username = "admin" password = "secret" roles = "admin,manager"/>
</tomcat-users>
이 파일은 username, password, 및 role. 주어진 사용자는 여러 역할을 가질 수 있습니다. 예를 들면username = "both" "tomcat"역할과 "role1"역할에 있습니다.
다른 역할을 식별하고 정의한 후에는 역할 기반 보안 제한을 다음을 사용하여 다른 웹 응용 프로그램 리소스에 적용 할 수 있습니다. <security-constraint> 요소 web.xml WEB-INF 디렉토리에서 사용할 수있는 파일.
다음은 web.xml의 샘플 항목입니다-
<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>SecuredBookSite</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>
Let only managers use this app
</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
...
</web-app>
위의 항목은-
/ secured / *와 일치하는 URL에 대한 모든 HTTP GET 또는 POST 요청에는 보안 제한이 적용됩니다.
관리자 역할을 가진 사람에게는 보안 리소스에 대한 액세스 권한이 부여됩니다.
그만큼 login-config 요소를 사용하여 BASIC 인증 형식.
다음을 포함한 URL을 찾아 보면 /security사용자 이름과 암호를 묻는 다음 대화 상자가 표시됩니다. 사용자를 제공하는 경우"admin" 및 암호 "secret"이면 다음과 일치하는 URL에 액세스 할 수 있습니다. /secured/* 이 리소스에 액세스 할 수있는 관리자 역할을 가진 사용자 admin을 정의 했으므로
양식 기반 인증
FORM 인증 방법을 사용하는 경우 사용자에게 사용자 이름과 암호를 묻는 로그인 양식을 제공해야합니다. 다음은 간단한 코드입니다.login.jsp. 이것은 동일한 목적을위한 양식을 만드는 데 도움이됩니다.
<html>
<body bgcolor = "#ffffff">
<form method = "POST" action ="j_security_check">
<table border = "0">
<tr>
<td>Login</td>
<td><input type = "text" name="j_username"></td>
</tr>
<tr>
<td>Password</td>
<td><input type = "password" name="j_password"></td>
</tr>
</table>
<input type = "submit" value = "Login!">
</form>
</body>
</html>
여기에서 로그인 양식에 다음과 같은 양식 요소가 포함되어 있는지 확인해야합니다. j_username 과 j_password. 액션<form> 태그는 j_security_check. POST양식 방법으로 사용해야합니다. 동시에, 당신은 수정해야 할 것입니다<login-config> FORM으로 인증 방법을 지정하는 태그-
<web-app>
...
<security-constraint>
<web-resource-collection>
<web-resource-name>SecuredBookSite</web-resource-name>
<url-pattern>/secured/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>Let only managers use this app</description>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<security-role>
<role-name>manager</role-name>
</security-role>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
...
</web-app>
이제 리소스에 액세스하려고 할 때 URL /secured/*, 사용자 ID 및 비밀번호를 묻는 위의 양식이 표시됩니다. 컨테이너에 "j_security_check"액션, 내부 메커니즘을 사용하여 호출자를 인증합니다.
로그인이 성공하고 호출자가 보안 리소스에 액세스 할 수있는 권한이있는 경우 컨테이너는 세션 ID를 사용하여 해당 지점에서 호출자의 로그인 세션을 식별합니다. 컨테이너는 세션 ID를 포함하는 쿠키로 로그인 세션을 유지합니다. 서버는 쿠키를 다시 클라이언트로 보내고 호출자가이 쿠키를 후속 요청과 함께 제공하는 한 컨테이너는 호출자가 누구인지 알 수 있습니다.
로그인에 실패하면 서버는 form-error-page 설정으로 식별 된 페이지를 다시 보냅니다.
여기, j_security_check양식 기반 로그인을 사용하는 애플리케이션이 로그인 양식에 대해 지정해야하는 조치입니다. 같은 형식으로 다음과 같은 텍스트 입력 컨트롤도 있어야합니다.j_username 그리고 password input control 호출 j_password. 이것을 볼 때, 양식에 포함 된 정보가 서버에 제출되어 이름과 비밀번호를 확인한다는 의미입니다. 이것이 수행되는 방법은 서버별로 다릅니다.
방법을 이해하려면 표준 Realm 구현 을 확인하십시오.j_security_check Tomcat 컨테이너에서 작동합니다 ..
서블릿 / JSP의 프로그래밍 방식 보안
그만큼 HttpServletRequest 객체는 런타임에 보안 정보를 채굴하는 데 사용할 수있는 다음 메서드를 제공합니다.
S. 아니. | 방법 및 설명 |
---|---|
1 | String getAuthType() 그만큼 getAuthType() 메서드는 Servlet을 보호하는 데 사용되는 인증 체계의 이름을 나타내는 String 개체를 반환합니다. |
2 | boolean isUserInRole(java.lang.String role) 그만큼 isUserInRole() 메서드는 부울 값을 반환합니다. 사용자가 지정된 역할에 있으면 true이고 그렇지 않으면 false입니다. |
삼 | String getProtocol() 그만큼 getProtocol()메서드는 요청을 보내는 데 사용 된 프로토콜을 나타내는 String 개체를 반환합니다. 이 값을 확인하여 보안 프로토콜이 사용되었는지 확인할 수 있습니다. |
4 | boolean isSecure() 그만큼 isSecure()메서드는 요청이 HTTPS를 사용하여 만들어 졌는지 여부를 나타내는 부울 값을 반환합니다. true 값은 연결이 안전함을 의미합니다. false 값은 요청이 아님을 의미합니다. |
5 | Principle getUserPrinciple() 그만큼 getUserPrinciple() 메소드는 현재 인증 된 사용자의 이름을 포함하는 java.security.Principle 객체를 반환합니다. |
예를 들어, 관리자 페이지로 연결되는 JavaServer 페이지의 경우 다음 코드가있을 수 있습니다.
<% if (request.isUserInRole("manager")) { %>
<a href = "managers/mgrreport.jsp">Manager Report</a>
<a href = "managers/personnel.jsp">Personnel Records</a>
<% } %>
JSP 또는 서블릿에서 사용자의 역할을 확인하여 사용자가 액세스 할 수있는 항목 만 표시하도록 웹 페이지를 사용자 정의 할 수 있습니다. 인증 양식에 입력 된 사용자 이름이 필요한 경우getRemoteUser 요청 개체의 메서드.