728x90
300x250
[PC 활용] 오라클 - 반복문으로 다중 입력 시(예:insert into) 퍼짐 현상


이 글은 JSP, Java, PHP, C#를 예로 들어서 개발을 수행했을 때, 태스트로 "DML(Insert 문)"으로 DB에 Query 호출을 반복문으로 하였을 때 초기 환경 상태에서의 오라클 데이터베이스에서 일어나는 반응에 대한 글이다.


[PseudoCode]


public void insertMember(){


    (연결자)
    Connection conn = .....;
    
    try{
        conn.open(); // (연결)

        for ( 1 to 10000 ){


           String sql = "insert into ........";

           conn.executeQuery(sql);

        }


     }catch(Exception e){

     }finally{
           conn.close(); // (종료)
     }

    


}


슈도 코드) 문제가 되는 영역


이런 문제를 처리하고자 했을 때, 발생되는 오류를 소개하려고 한다.


[태스트 환경]

1. MS Windows 10

2. Oracle 11g (Express Edition, XE)



1. 프로그래밍 도구에서 호출되는 오류명


ora-12519 TNS:no appropriate handler found


이러한 오류가 발생한다면, 다음과 같이 입력하여 해결하면 된다.



2. 해결 방법


명령어를 몇 가지 요약하였다.


1. 명령 프롬프트 실행하기

   cmd


2. 관리자 계정 접속 명령어

   sqlplus "/as sysdba"


3. 프로세스 조회하기
   SQL> SELECT * FROM v$resource_limit where resource_name='processes';


4. 프로세스 조정하기 크기
   SQL> ALTER SYSTEM SET PROCESSES=500 SCOPE=spfile; -- 200으로 늘려줌


5. 서버 재시작
   SQL> shutdown immediate; --셧다운
   SQL> startup; --재시작



그림 1. cmd 명령어 - 시작 메뉴


시작 메뉴에서 cmd를 입력한다.



그림 2. sqlplus


sqlplus "/as sysdba"


이렇게 입력해도 관리자 권한으로 오라클에 접속할 수 있다.


SQL> SELECT * FROM v$resource_limit where resource_name='processes';


프로세스 조회 명령어로 프로세스 자원 한계를 확인하자.

프로세스가 100으로 작게 설정되어 있으니 조금 더 늘려보도록 하자.



그림 3. sqlplus


SQL> ALTER SYSTEM SET PROCESSES=500 SCOPE=spfile;


프로세스 500으로 수정을 해주었다.

변경되었는지 조회를 해보자.


SQL> SELECT * FROM v$resource_limit where resource_name='processes';


조회를 해보니, 변경되지 않았다.

그래서 commit을 안 해서 발생한 문제인지 commit을 입력하였다.


SQL> commit;


그리고 다시 조회를 해본다.


SQL> SELECT * FROM v$resource_limit where resource_name='processes';


변경되지 않았다.

오라클 DB를 재부팅해보면 해결되는 문제인지 시도해보았다.



그림 4. sqlplus


SQL> shutdown immediate;

SQL> startup;


서버를 다시 시작하였다.

그리고 프로세스 조회 명령어를 입력하였다.


SQL> SELECT * FROM v$resource_limit where resource_name='processes';


변경된 프로세스 내용을 확인할 수 있다.

반응형
728x90
300x250

[Spring-Framework] 13. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-XML) (1)


많은 고민과 엄선하여 2020-09월 기준의 최신 프레임워크를 적용한 Spring Security 5.4 프로젝트를 소개하려고 한다.

이전의 돌아다니는 방법으로 Spring Security를 학습하려고 한다면, 많은 오류부터 경험하게 될 가능성이 높아서 수 많은 실험 끝에 완성하였다.


인터넷 검색 등을 시도해보면, "Spring Boot"를 적용하면 훨씬 쉽고 만들 수 있다는 가능성에 대한 글들을 많이 보았다.


순수한 Spring-Framework에 대한 관련 주제를 담은 글의 비중은 매우 적어서 수 차례 연구를 완료한 후에 글을 작성하게 되었다.


[작업환경]

[WAS(Web Application Server), 웹 애플리케이션 서버]

1. apache-tomcat-9.0.37-windows-x64


[DBMS(DataBase Management System - Tools]

2. sqldeveloper-19.2.1.247.2212-x64


[DB(DataBase)]

3. Oracle Databases 19.3.0.0


[IDE(Integration Development Environment)]

4. Spring-Tool Suites 4-4.7.2. Releases.


[Framework(프레임워크)]

5. spring-security-taglibs(5.4)

6. spring-security-config(5.4)

7. spring-security-web(5.4)

8. spring-security-core(5.4)

9. javax.servlet-api(4.0.1)

10. spring-webmvc(5.2.9.RELEASE)

11. spring-context(5.2.9.RELEASE)
12. Maven 3.6.3/1.16.0.20200610-1735


[Java]

OpenJDK-14.0.2 (https://openjdk.java.net/)


원리나 배경 등 이런 것도 물론 중요하나 Spring Security는 다소 프로젝트 위주로 경험 후에 터득하는 것이 더 적합할 것으로 보인다.


* 다음 주제 - (자바 버전으로 구현)

1. [Spring-Framework] 16. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-Java) (1)
https://yyman.tistory.com/1422


2. [Spring-Framework] 17. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-Java) (2)

https://yyman.tistory.com/1423


3. [Spring-Framework] 18. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-Java) (3)

https://yyman.tistory.com/1424



1. 결과


어떤 프로젝트를 하는지 소개하려고 한다. 지금 구성하는 화면은 스프링 시큐리티의 "커스텀 로그인"이라는 것이다.

커스텀 로그인 코드만 주석으로 정리해보면, 내장된 로그인 화면을 살펴볼 수 있다.



그림 1. 결과(로그인 폼) - 로그인 전




그림 2. 결과(로그인 폼) - 계정 정보의 오류




그림 3. 관리자 페이지 - "권한이 없는 사용자가 접속했을 경우"




그림 4. 로그인된 화면




그림 5. 비밀번호 랜덤 암호(bcrypt 기법 적용)



그림 6. 로그인된 화면 - "user 계정"




그림 7. 권한이 있는 사용자 - 관리자 홈 접속 화면



그림 7-1. 접근 제한 페이지 출력




1-1. 결과 - 프로젝트 구성도


어떤 형태로 프로젝트가 구성되어있는지 소개하겠다.

작업해야 할 양이 조금 많다.



그림 8. 프로젝트 구성도





2. 데이터베이스 설계


데이터베이스 기능도 지원한다. 데이터베이스를 사용 안하는 방법에 대해서도 소개하고 있으니 참고하면 되겠다.


데이터베이스 설계 기준은 Spring Security에서 제공하는 계정, 권한, 그룹 시스템 로직을 바탕으로 작성하였다.

데이터베이스 기준으로 보면, 스프링 시큐리티는 하위버전부터 현재까지 큰 차이는 없다.


참고: 기본적인 기능으로 데이터베이스 설계를 하지 않고도 Spring Security를 적용하여 사용할 수도 있다.


그림 9. Membership - ERD 설계도




그림 10. "comp_users" 테이블



그림 11. "comp_authorities" 테이블



그림 12. "comp_groups" 테이블



그림 13. "comp_group_members" 테이블



그림 14. "comp_group_authorities" 테이블



3. SQL (Create table)


SQL로 작업해야 할 테이블에 대해서 기술하였으니 참고하면 도움이 되겠다.


[암호화된 암호]

계정: user -> 임시비밀번호: password

계정: admin -> 임시비밀번호: pass


CREATE TABLE comp_users (

username VARCHAR(50) NOT NULL,

password VARCHAR(300) NOT NULL,

enabled INT NOT NULL,

PRIMARY KEY (username)

);


CREATE TABLE comp_authorities (

  username VARCHAR(50) NOT NULL,

  authority VARCHAR(50) NOT NULL,

  CONSTRAINT fk_authorities_users FOREIGN KEY (username) REFERENCES comp_users (username)

); 


CREATE TABLE comp_groups(

id VARCHAR2(20) NOT NULL,

group_name VARCHAR2(20) NULL

);


CREATE TABLE comp_group_authorities(

group_id VARCHAR2(20) NOT NULL,

authority VARCHAR2(20) NOT NULL

);


CREATE TABLE comp_group_members(

group_id VARCHAR2(20) NOT NULL,

username VARCHAR2(20) NOT NULL

);



-- 계정

INSERT INTO comp_users (username, password, enabled) VALUES ('user', '$2a$10$x04djNV2e9rpcPPRyXoLk.rMm6iZe2/vYdzpqHQcLeNSYdt7kc30O', 1);

INSERT INTO comp_users (username, password, enabled) VALUES ('admin', '$2a$10$QUddY3O/6ZgkYCR6MFlv9.nqA501Fm0cc/ZxQHX5pwb1o0CYCTiIS', 1);


-- 사용자 권한

INSERT INTO comp_authorities (username, authority) VALUES ('user', 'ROLE_ADMIN');

INSERT INTO comp_authorities (username, authority) VALUES ('admin', 'ROLE_USER');


-- 그룹

INSERT INTO comp_groups (id, group_name) VALUES ('G01', '관리자 그룹');

INSERT INTO comp_groups (id, group_name) VALUES ('G02', '사용자 그룹');


-- 그룹 권한

INSERT INTO comp_group_authorities (group_id, authority) VALUES ('G01', 'ROLE_ADMIN');

INSERT INTO comp_group_authorities (group_id, authority) VALUES ('G01', 'ROLE_USER');

INSERT INTO comp_group_authorities (group_id, authority) VALUES ('G02', 'ROLE_USER');


-- 그룹 회원

INSERT INTO comp_group_members (group_id, username) VALUES ('G01', 'user');

INSERT INTO comp_group_members (group_id, username) VALUES ('G02', 'admin');



파일명: sampleDb-oracledb.sql


[첨부(Attachments)]

sampleDb-oracledb.zip





4. 프로젝트 생성하기


그림으로 자세하게 표현하고 있는 이유는 Spring-Framework 순수한 프로젝트로 초기 개발환경을 셋팅하려고 하면 정말 많은 시간이 소요된다.

그리하여 매우 자세하게 소개하고 있으니 참고하면 도움이 될 것 같다.


비고: Spring Legacy Project가 보이지 않는다면, Help->Eclipse Marketplace에서 "STS"를 검색하여 AddOn을 설치하면 된다.



그림 15. Eclipse Marketplace의 화면


Spring Tools 3 Add-On for Spring Tools 4 3.9.14.RELEASES를 설치해주면 된다.





그림 16. Spring Legacy Project 생성하기


SLP(Spring Legacy Project)의 Spring MVC Project는 기본 버전이 매우 낮은 "3.2.2 RELEASES"이다.


비고: pom.xml을 변경해주면, 현재의 최신 프레임워크 버전으로 변경할 수 있다.



그림 17. Spring Legacy Project 생성하기


프로젝트명을 지정한 후 Next를 누른다.



그림 18. Spring Legacy Project 생성하기


상위 경로를 입력한 후 "Finish"를 누른다.



5. pom.xml 수정하기


수정할 부분이 조금 많다.

어려운 건 아니니깐 따라하면 된다.


http://mvnrepository.com에 들어가서 정보를 잘 찾아서 변경해주면 된다.


변경하거나 추가한 부분은 굵은 글자로 표기하였다.


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>com.web</groupId>

<artifactId>springsecurity5</artifactId>

<name>SpringSecurity5</name>

<packaging>war</packaging>

<version>1.0.0-BUILD-SNAPSHOT</version>

<properties>

<java-version>14</java-version>

<org.springframework-version>5.2.9.RELEASE</org.springframework-version>

<org.aspectj-version>1.6.10</org.aspectj-version>

<org.slf4j-version>1.6.6</org.slf4j-version>

</properties>

<dependencies>

<!-- Spring -->

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-context</artifactId>

    <version>5.2.9.RELEASE</version>

<exclusions>

<!-- Exclude Commons Logging in favor of SLF4j -->

<exclusion>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

</exclusion>

</exclusions>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->

<dependency>

    <groupId>org.springframework</groupId>

    <artifactId>spring-webmvc</artifactId>

    <version>5.2.9.RELEASE</version>

</dependency>


<!-- AspectJ -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>${org.aspectj-version}</version>

</dependency>

<!-- Logging -->

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-api</artifactId>

<version>${org.slf4j-version}</version>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>jcl-over-slf4j</artifactId>

<version>${org.slf4j-version}</version>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId>

<version>${org.slf4j-version}</version>

<scope>runtime</scope>

</dependency>

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.15</version>

<exclusions>

<exclusion>

<groupId>javax.mail</groupId>

<artifactId>mail</artifactId>

</exclusion>

<exclusion>

<groupId>javax.jms</groupId>

<artifactId>jms</artifactId>

</exclusion>

<exclusion>

<groupId>com.sun.jdmk</groupId>

<artifactId>jmxtools</artifactId>

</exclusion>

<exclusion>

<groupId>com.sun.jmx</groupId>

<artifactId>jmxri</artifactId>

</exclusion>

</exclusions>

<scope>runtime</scope>

</dependency>


<!-- @Inject -->

<dependency>

<groupId>javax.inject</groupId>

<artifactId>javax.inject</artifactId>

<version>1</version>

</dependency>


<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>4.0.1</version>

    <scope>provided</scope>

</dependency>


<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>jsp-api</artifactId>

<version>2.1</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->

<dependency>

    <groupId>org.springframework.security</groupId>

    <artifactId>spring-security-core</artifactId>

    <version>5.4.0</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->

<dependency>

    <groupId>org.springframework.security</groupId>

    <artifactId>spring-security-web</artifactId>

    <version>5.4.0</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->

<dependency>

    <groupId>org.springframework.security</groupId>

    <artifactId>spring-security-config</artifactId>

    <version>5.4.0</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->

<dependency>

    <groupId>org.springframework.security</groupId>

    <artifactId>spring-security-taglibs</artifactId>

    <version>5.4.0</version>

</dependency>

<!-- Test -->

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.7</version>

<scope>test</scope>

</dependency>

<!-- Oracle DB(19 Version) -->

<dependency>

<groupId>com.oracle.database.jdbc</groupId>

<artifactId>ojdbc8</artifactId>

<version>19.3.0.0</version>

</dependency>

</dependencies>

    <build>

        <plugins>

            <plugin>

                <artifactId>maven-eclipse-plugin</artifactId>

                <version>2.9</version>

                <configuration>

                    <additionalProjectnatures>

                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>

                    </additionalProjectnatures>

                    <additionalBuildcommands>

                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>

                    </additionalBuildcommands>

                    <downloadSources>true</downloadSources>

                    <downloadJavadocs>true</downloadJavadocs>

                </configuration>

            </plugin>

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-compiler-plugin</artifactId>

                <version>2.5.1</version>

                <configuration>

                    <source>1.6</source>

                    <target>1.6</target>

                    <compilerArgument>-Xlint:all</compilerArgument>

                    <showWarnings>true</showWarnings>

                    <showDeprecation>true</showDeprecation>

                </configuration>

            </plugin>

            <plugin>

                <groupId>org.codehaus.mojo</groupId>

                <artifactId>exec-maven-plugin</artifactId>

                <version>1.2.1</version>

                <configuration>

                    <mainClass>org.test.int1.Main</mainClass>

                </configuration>

            </plugin>

        </plugins>

    </build>

</project>



파일명: pom.xml


[첨부(Attachments)]

pom.zip



6. 자바 버전 바꾸기 - Build Path, Project Facts


자바 버전을 변경해줘야 한다.



그림 19. Spring의 Properties 속성 메뉴


프로젝트를 클릭한다.

마우스 오른쪽 버튼을 누른다.

"Properties"를 클릭한다.



그림 20. Properties의 Build Path


JRE System Library [JavaSE-버전]을 14로 변경해준다. (1.7 이상으로만 해주면 됨.)

단, 버전은 Project Factes, Build Path, Pom.xml를 깔맞춤해주는 게 좋다.



그림 21. Properties의 Project Factes


Project Factes의 버전을 14로 변경해준다.




7. security-context.xml 파일 - 새로 만들기


"security-context.xml"은 초기에 파일이 존재한 건 아니다.

만들어줘야 한다.


폴더: src/main/java/webapp/WEB-INF/spring/

파일명: security-context.xml



그림 22. spring 폴더를 오른쪽 버튼 클릭했을 때 팝업 메뉴


spring 폴더를 오른쪽 버튼으로 클릭한다.

New->File을 클릭한다.



그림 23. xml 파일 생성하기


security-context.xml을 입력한 후, Finish를 누른다.



그림 24. xml 파일 생성하기





8. security-context.xml 파일 - 코드 편집(입력)


코드를 입력해준다.


<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"

    xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/security 

http://www.springframework.org/schema/security/spring-security.xsd

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

<!-- 보안 미적용 -->

<!-- <http pattern="/**/*.js" security="none" />  -->

<http auto-config="true" use-expressions="true">

      

<intercept-url pattern="/member/accessDenied" access="permitAll" />

<intercept-url pattern="/member/accessDeniedView" access="permitAll" />

<intercept-url pattern="/member/loginForm" access="permitAll" />

<intercept-url pattern="/" access="permitAll" />

<intercept-url pattern="/encode-password" access="permitAll" />

<intercept-url pattern="/admin/**" access="hasRole('ADMIN')" />

<intercept-url pattern="/**" access="hasAnyRole('USER')" />

<form-login login-page="/member/loginForm"

default-target-url="/"

authentication-failure-url="/member/loginForm?error"

username-parameter="id"

password-parameter="password" />

<!-- Form-login의 항목 -->

<!-- Default-Target-URL: 로그인 성공할 경우, 접속할 사이트 -->

<logout logout-url="/logout" logout-success-url="/" />

<!-- Servlet 3.0부터 access-denied-handler 미지원 -->

<!-- web.xml으로 제어할 것 -->

<!-- <access-denied-handler ref="customAccessDeniedHandler"/> -->

<access-denied-handler error-page="/member/accessDenied" />

<csrf disabled="true" />

</http>

<!-- DataSource 추후 지원 -->

<!-- 1. HSQLDB -->

<!-- ClassDriver = org.hsqldb.jdbcDriver -->

<!-- Url = jdbc:hsqldb:hsql://localhost:9001 -->

<!-- 2. Oracle JDBC -->

<!-- ClassDriver = oracle.jdbc.driver.OracleDriver -->

<!-- Url = jdbc:oracle:thin:@127.0.0.1:1521:orcl -->

<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />

<beans:property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />

<beans:property name="username" value="{사용자계정}" />

<beans:property name="password" value="{비밀번호}" />

</beans:bean>

<!-- 사용자 세부 계정 서비스 -->

<beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">

<beans:property name="dataSource" ref="dataSource" />

<beans:property name="usersByUsernameQuery" value="select username,password,enabled from comp_users where username = ?" />

<beans:property name="authoritiesByUsernameQuery" value="select username,authority from comp_authorities where username = ?" />

<beans:property name="groupAuthoritiesByUsernameQuery" value="select g.id, g.group_name, ga.authority from comp_groups g, 

  comp_group_members gm, comp_group_authorities ga where gm.username = ? 

  and g.id = ga.group_id and g.id = gm.group_id" />

</beans:bean>

<!-- provider -->

<authentication-manager>

<authentication-provider user-service-ref="userDetailsService">

<!-- <authentication-provider> -->

<!-- <user-service>-->

<!-- <user name="user" password="password" authorities="ROLE_USER" /> -->

<!-- xml 내에 사용자 계정 등록 -->

<!-- <user name="user" password="$2a$10$Gkr61IXH0YI/.Yh5T6fzteGLCLT6nOmMkID/DmFhWtPmu1WwPrDKq" authorities="ROLE_USER" /> -->

<!-- <user name="admin" password="password" authorities="ROLE_ADMIN" /> -->

<!-- </user-service> -->

<password-encoder ref="passwordEncoder"/>

</authentication-provider>

</authentication-manager>

<!-- 암호화 패키지 -->

<beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> 


</beans:beans>


파일명: security-context.xml


[첨부(Attachments)]

security-context.zip



[순정 버전]


<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"

    xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/security 

http://www.springframework.org/schema/security/spring-security.xsd

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

<http>


<intercept-url pattern="/member/accessDenied" access="permitAll" />

<intercept-url pattern="/member/accessDeniedView" access="permitAll" />

<intercept-url pattern="/member/loginForm" access="permitAll" />

<intercept-url pattern="/" access="permitAll" />

<intercept-url pattern="/encode-password" access="permitAll" />

<intercept-url pattern="/admin/**" access="hasRole('ADMIN')" />

<intercept-url pattern="/**" access="hasAnyRole('USER')" />

<form-login login-page="/member/loginForm"

default-target-url="/"

authentication-failure-url="/member/loginForm?error"

username-parameter="id"

password-parameter="password" />

<!-- Form-login의 항목 -->

<!-- Default-Target-URL: 로그인 성공할 경우, 접속할 사이트 -->

<logout logout-url="/logout" logout-success-url="/" />

<access-denied-handler error-page="/member/accessDenied" />

</http> 


      

<authentication-manager>

<authentication-provider>

<user-service>

                              <user name="user" password="password" authorities="ROLE_USER" />

      <user name="admin" password="password" authorities="ROLE_ADMIN" />

</user-service>

</authentication-provider>

</authentication-manager>

</beans:beans>




물론 순정버전으로 구현해봐도 동작은 할 것이다. 실험해보려면 해봐도 무방하다.

최신 Spring Security 5의 경우에는 비밀번호 암호화에 대해서 엄격하게 확인을 하고 있다.
- 로그인 페이지는 열리는데, 암호화 패키지 문제 등이 발생할 수도 있다.


해결 방법1) 암호화 미적용이라고 지정해주기


<user name="user" password="{noop}password" authorities="ROLE_USER" />

<user name="admin" password="{noop}password" authorities="ROLE_ADMIN" />


{noop}를 넣어주면서 해결한다.


해결 방법2) 암호화 미적용이라고 지정해주기

(1단계: 비밀번호를 "
org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" 클래스를 활용해서 인코딩한다.)


(2단계: 메모한 복잡한 암호를 password에 입력해준다.)


= <user name="user" password="$2a$10$Gkr61IXH0YI/.Yh5T6fzteGLCLT6nOmMkID/DmFhWtPmu1WwPrDKq" authorities="ROLE_USER" />


(3단계: 암호화 패키지를 사용하고 있다는 것을 정의해준다.)


                       (중략)

            <authentication-provider>

                       (중략)

<password-encoder ref="passwordEncoder"/>

</authentication-provider>


            <!-- 암호화 패키지 -->

           <beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> 


</beans:beans>


"org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" 클래스는 Controller나 jsp 등에서도 계속 활용할 수 있다.




9. web.xml 파일 - 코드 편집


서블릿 버전이 낮게 정의된 web.xml 파일의 코드와 더불어 security-context.xml을 사용하고 있다는 것을 정의해줘야 한다.


<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

  <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>

  <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

/WEB-INF/spring/root-context.xml

/WEB-INF/spring/security-context.xml

</param-value>

  </context-param>

  <listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>

  <servlet>

    <servlet-name>appServlet</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <init-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>

    </init-param>

    <load-on-startup>1</load-on-startup>

  </servlet>

  <servlet-mapping>

    <servlet-name>appServlet</servlet-name>

    <url-pattern>/</url-pattern>

  </servlet-mapping>

  <!-- <welcome-file-list>  -->

  <!--  <welcome-file>index.do</welcome-file> -->

  <!-- </welcome-file-list>    -->

  

  

  <!-- <error-page> -->

  <!--  <error-code>500</error-code> -->

  <!--  <location>/member/accessDenied</location> -->

  <!-- </error-page> -->

  

  <!-- <location>/WEB-INF/views/common/accessDenied.jsp</location> -->

</web-app>


파일명: web.xml


[첨부(Attachments)]

web.zip


(중략)

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">


(중략)


변경 이력1: servlet 2.x -> 3.1 스펙으로 변경


(중략)


<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>

  <context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

/WEB-INF/spring/root-context.xml

/WEB-INF/spring/security-context.xml

</param-value>

  </context-param>


(중략)


변경 이력2: springSecurityFillter와 security-context.xml 정의하기



10. Controller - CryptController.java


암호화 패키지에 관한 것이다. 기본 코드를 잘 활용하여 재사용해봐도 좋을 듯 싶다.


package com.web.springsecurity5.controller;


import java.text.DateFormat;

import java.util.Date;

import java.util.Locale;


import javax.servlet.http.HttpServletRequest;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.security.crypto.password.PasswordEncoder;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.context.WebApplicationContext;

import org.springframework.web.context.support.WebApplicationContextUtils;


@Controller

public class CryptController {


private static final Logger logger = LoggerFactory.getLogger(CryptController.class);

/**

* Simply selects the home view to render by returning its name.

*/

@RequestMapping(value = "/encode-password", method = RequestMethod.GET)

public String bcrypt(Locale locale, Model model, HttpServletRequest req) {

logger.info("Welcome home! The client locale is {}.", locale);

WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(req.getServletContext());

        PasswordEncoder passwordEncoder = context.getBean(PasswordEncoder.class);


        String password = req.getParameter("password");

        String encode = passwordEncoder.encode(password);


        model.addAttribute("encode", encode);

        System.out.println(encode);

        

return "home";

}

}



파일명: CryptController.java


[첨부(Attachments)]

CryptController.zip



* 2부에서 만나요.


2부에서 추가로 소개하도록 하겠다.


1. [Spring-Framework] 13. Spring MVC, Spring Security 5.4, Oracle - 보안처리(로그인-XML) (2), 2020-09-26

https://yyman.tistory.com/1420


반응형

+ Recent posts