개발자가 되고 싶은 사람

Spring-Security 환경설정 및 로그인화면 구현 1

|

Spring-Security

  • 스프링 시큐리티(Spring Security)는 스프링 서브 프로젝트 중 하나로 스프링 기반의 어플리케이션을 보호하기 위한 필수적인 프레임워크이다.
  • 스프링 시큐리티는 보안을 체계적으로 관리하며, 개발한 스프링 어플리케이션들과 유연하게 연결된다. 그리고 오랜기간 다양한 피드백으로 개발되어 신뢰도가 높다.
  • 간단안 선언문만으로도 작동하므로 대량의 코드를 손쉽게 절약해준다.
  • 주의점!!, depengency에 환경설정시 스프링 프로젝트의 버전과 시큐리티 라이브러리 버전을 주의한다. 나의 경우 라이브러리 추가시 버전이 달라 충돌이 나기도 했다..(이게 맞는말인가?)
  • 인프런 자바스프링프레임워크 25-27강

환경설정

[1] project의 pom.xml에 스프링에서 지원하는 security 라이브러리를 추가한다.

        
<!-- Spring Security -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>3.2.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>3.2.3.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
	<version>3.2.0.RELEASE</version>
</dependency>

[2] 보안관련 설정파일을 만들어 web.xml에 추가한다.

  • web.xml에 아래 경로를 추가한다.
  • 해당경로에 설정파일을 만든다. /WEB-INF/spring/appServlet/security-context.xml
        
<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>

[3] 이어서 web.xml에 filter를 적용한다.

  • 여기서 주의할 점은 의 값이 반드시 springSecurityFilterChain이어야 한다!.
        
<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>

[4] 여기서 죽게 고생 ㅠㅠ- appServlet안에 security-context.xml파일을 만든다.

bean에 xmlns:security="http://www.springframework.org/schema/security"를 추가한다.

뭣때문인지 모르겠는데 여기서부터 인강처럼 되지않고 시큐리티 태그에 에러가 계속 떳다….

그래서 나는 아래과 같이 수정. 그랬더니 잘된다.

  • security-context.xml의 네임스페이스는 아래와 같이 설정하였다.(인강이랑 다른점)
  • 이 네임스페이스는 security를 기본 xmlns로 선택하고 있는 컨텍스트 네임스페이스이다.
  • <beans:beans>로 된 점을 주의
  • <http auto-config="true"> : 스프링 시큐리티는 기본적으로 Ahthorization(권한 부여)에 관한 대부분의 설정이 요소에 위치해 있으며 설정 가능한 모든 요소에 디폴트 값이 존재한다. 그러므로 요소의 auto-config 속성을 true로 잡아줌으로써 우리는 모든 디폴트 속성값으로 서버를 설정한 것.
  • <intercept-url> : DelegatingFilterProxy에서 가로챈 요청을 좀 더 세부적으로 나눠주며(pattern) 접근할 수 있는 권한을 설정(access)합니다.
  • ROLE_USER와 같이 부여된 권한(Granted Authority) 설정은 어디서 하게 되는 걸까? : 리소스의 권한(Intercept)은 Authentication(인증)의 영역에 포함됩니다. 우리가 무언가의 인증을 받은 후에 리소스에 접근할 권한을 얻게 되므로 리소스의 권한은 인증작업에 일부가 되는 셈이죠. 그렇다면 부여된 권한(Granted Authority)는 어디에 속할까요? 바로 Authorization(권한부여)에 속하게 됩니다. 권한을 부여하려면 먼저 권한부터 설정되있어야 하며 궁극적으로 설정된 권한을 유저에게 부여해줘야 하기 때문입니다. 그러므로 <http>요소는 Authentication(인증)의 범주에 속해있으며 스프링 시큐리티는 Authorization(권한부여)의 영역을 분할하기 위해 <authorization-manager>란 요소를 따로 사용하고 있습니다. 출처:부여된 권한
        
<?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/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.2.xsd">
  • <intercept-url>은 DelegatingFilterProxy에서 가로챈 요청을 좀 더 세부적으로 나눠주며(pattern) 접근할 수 있는 권한을 설정(access)한다.
  • 먼저 인증받을 사용자의 아이디와 비밀번호를 입력한 뒤에 해당 사용자에게 권한(ROLE_USER)를 부여한다. 가급적 ‘ROLE_‘ 이란 문자열로 시작해야 한다. 왜냐하면 스프링 시큐리티는 RoleVoter라고 부여된 권한(Granted Authority)을 검사하는 클래스를 가지고 있는데 이 검사자가 문자열이 ROLE_이란 접두어로 시작하는 지를 검사하기 때문. 만약 ROLE_이란 접두어로 시작하지 않는다면 시큐리티는 접근 보류(ACCESS_ABSTAIN)라는 결론을 짓게 된다.
        	
<http auto-config='true' >
        <intercept-url pattern="/login.html*" access="ROLE_USER"/>
        <intercept-url pattern="/welcome.html*" access="ROLE_ADMIN"/>
</http>
	
<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="user" password="123" authorities="ROLE_USER"/>
            <user name="admin" password="123" authorities="ROLE_ADMIN,ROLE_USER"/>
        </user-service>
    </authentication-provider>
</authentication-manager>
</beans:beans>

보안관련 taglib를 추가한 뒤 로그인화면에 적용하기.

[1] pom.xml에 아래와 같이 taglib를 추가할 수 있다. (프로젝트 스프링프레임워크 버전이 3.2이므로 똑같이 3.2로 맞춰서 add시킴.) 이미지

[2] 그리고 login.jsp 파일에 taglib 를 추가하고 아래의 소스코드를 넣어 로그인이 되도록한다.

  • 추가하는 taglib <%@ taglib uri="http://www.springframework.org/security/tags" prefix="s" %>

[3] s 엘리먼트요소에 ifAnyGranted라는 권한을 ROLE_USER 로 줘서, security-context.xml에 설정했던 user 정보가 맞는지 체크한다(?) 틀리면 로그인 실패 페이지를, 맞으면 로그인화면을 반환한다.

        
<s:authorize ifAnyGranted="ROLE_USER">
<p> is Log-In</p>
</s:authorize>

<s:authorize ifNotGranted="ROLE_USER">
<p> is Log-Out</p>
</s:authorize>

<%-- USER ID : ${pageContext.request.userPrincipal.name}<br/> --%>
USER ID : <s:authentication property="name"/><br/>
<a href="${pageContext.request.contextPath}/j_spring_security_logout">Log Out</a> <br />

출처

Welcome to Jekyll!

|

You’ll find this post in your _posts directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve, which launches a web server and auto-regenerates your site when a file is updated.

To add new posts, simply add a file in the _posts directory that follows the convention YYYY-MM-DD-name-of-post.ext and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.

Jekyll also offers powerful support for code snippets:

def print_hi(name)
  puts "Hi, #{name}"
end
print_hi('Tom')
#=> prints 'Hi, Tom' to STDOUT.

Check out the Jekyll docs for more info on how to get the most out of Jekyll. File all bugs/feature requests at Jekyll’s GitHub repo. If you have questions, you can ask them on Jekyll Talk.

깃허브블로그 jekyll, lanyon theme 적용

|

Gitblog, jekyll 사용 장점

  • 정적페이지의 사용으로 빠르다.
  • db를 처리하는부분이 없기때문에 더 안전하다. 그렇기 때문에 유지보수가 훨씬 수월하다.
  • 적은 비용. 깃허브를 통한 프리호스팅 지원.
  • markdown 지원.

블로그테마 변경

  • 포스팅 스타일의 통일성과 git과 친해지기 위해, 코딩습관을 기르기 위해 깃블로그를 시작.
  • 사용하다보니, 변경사항이 깃페이지에 등록되는데 시간이 꽤 오래걸렸고, 수정즉시 확인해볼 수 있도록 환경설정을 해야함을 느꼈다.
  • 윈도우로 jekyll을 설치하는 방법을 찾아봤고, 동시에 테마도 더 마음에 드는걸로 수정하였다.

추후 진행할 작업

  1. 댓글기능(disqus shortname셋팅완료)
  2. 구글 Analystic 적용해보기
  3. mother blog 참고하기!!!!
  4. 한글 폰트 수정(_config.scss 에서, $font-serif: 의 serfi란 걸 지움/완료).

Github에 업로드

    $ git init
    $ git add .
    $ git commit -m "커밋내용"
    $ git push origin master

jekyll serve실행

  • $ jekyll serve => 개발서버가 실행됩니다. http://localhost:4000/ (자동 재생성: 활성화. 비활성화하려면 --no-watch 를 사용하세요.)
  • $ jekyll serve --no-watch => jekyll serve 와 동일하지만 변경사항을 감시하지 않습니다.
  • $ jekyll build => 현재 폴더의 컨텐츠를 가지고 ./_site 에 사이트를 생성합니다.

블로그 정리, 카테고리와 태그의 차이점

  • 블로그 카테고리는 게시물을 제목이나 유형으로 분류할 때 사용되며, 내 블로그에 대한 일반적인 주제나 목차로 이해할 수 있습니다. 예를 들어, 음식에 관한 블로그를 운영한다면, 아침, 점심, 저녁, 음료 등을 카테고리로 선택할 수 있습니다. 패션 블로그를 운영한다면, 여름, 겨울, 가을 등을 카테고리로 선택할 수 있습니다. 단, 독자가 혼란스러울 수 있으니 너무 많은 카테고리를 추가하지 않을 것을 권장합니다.

  • 태그의 목적은 내 게시물의 세부 정보를 설명하는 것이며, 태그는 해시태그와 유사한 것으로 이해할 수 있습니다. 블로그 게시물에 여러 태그를 추가할 수 있습니다. 일반적으로 블로그에 카테고리보다 태그가 많습니다. 예를 들어, 내 블로그 게시물이 뉴욕에 위치한 일본 스시 전문점에 관한 것이라면, 내 태그는 “음식”, “스시”, “생선”, “음식점”, “뉴욕” 등이 될 수 있습니다. 블로그 태그는 태그 클라우드 요소에서 표시할 수 있습니다. 독자는 태그를 클릭해 블로그 게시물을 필터링할 수 있습니다.

참고

  1. 콩로그.net/Jekyll 블로그에 테마 적용하기
  2. 지킬로 깃허브에 무료 블로그 만들기
  3. Jekyll과 Lanyon을 이용한 블로깅 및 테마 편집 방법/***
  4. Jekyll 윈도우에 설치해서 사용하기
  5. Jekyll로 GitHub에 blog 만들기
  6. Jekyll을 사용하여 GitHub Pages 만들기
  7. 초보자를 위한 Jekyll Blog 시작하기
  8. jekyll-docs
  9. 디스커스 댓글 기능적용

Java 입출력, BufferedReader, StringTokenizer

|

자바의 입력 Class

  • Scanner, BufferedReader, StringTokenizer
  • BufferedReader, StringTokenizer 는 문자열로 활용하기 위하여 사용. BufferedReader를 사용하는 것이 Scanner를 사용하는 것보다 빠르다.
  • BufferedReader는 문자열에 최적화 되어 있음.

  • Scanner를 사용했을시 입력 형태.
//Scanner를 사용했을시 입력 형태.
Scanner sc = new Scanner(System.in);

int n = sc.nextInt(); // int
long l = sc.nextLong(); // int
String s = sc.next(); // String
String s = sc.nextLine(); // String

BufferedReader를 사용할때

  • 아래와 같이 한줄로 입력시, sc.nextInt()를 12번 호출하는건 비효율적이다. 입력갯수가 큰 알고리즘 문제의 경우 시간제한에 걸리게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 // 한줄 입력

for(int i=0;i<12;i++) {
sc.nextInt();
}
  • 그래서 아래와 같이 사용한다.
  • 문자열로 받고 split메소드를 이용해서 공백을 기준으로 잘라서 활용.
  • integer.parseInt() 형변환을 통해 사용.
1 2 3 4 5 6 7 8 9 10 11 12 // 한줄 입력

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");

// s[0] = "1"; Integer.parseInt(s[0]) => 1
// s[1] = "2";
// s[2] = "3";
// .....

StringTokenizer 사용목적

  • BufferedReader는 잘라서 배열과 같이 인덱스를 사용하여 접근하여 사용.
  • StringTokenizer는 공백이 있다면 뒤에 문자열이 공백 자리를 땡겨 채우도록 한다.
  • StringTokenizer가 BufferedReader보다 빠르게 사용될 수 있다.
  • 문자열을 자르게 위해 split을 사용할땐, split은 정규식을 기반으로 자르는 로직으로서 내부는 복잡하다. 그에 비해 StringTokenizer의 nextToken()메소드는 단순히 공백 자리를 땡겨 채우는 것이다. 그렇기 때문에 속도 차이가 날 수 밖에 없다.
  • 정규식이나 인덱스 접근과 같은 처리가 필요없다면 StringTokenizer를 사용하는 것이 효율적이다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
StringTokenizer st = new StringTokenizer(br.readLine());

// AB CDD EFFF GH 입력

st.nextToken() // AB
st.nextToken() // CDD
st.nextToken() // EFFF
st.nextToken() // GH

StringTokenizer 사용법

  • 자바에서는 String을 token단위로 끊어주는 StringTokenizer 클래스를 제공한다.
  • 예를들어 “this is my string” 이라는 스트링을 this, is, my, string 4개의 스트링으로 끊어주는 기능을 제공한다.
  • 그리고 공백말고도 다른 구획문자(delimiter)를 사용할수도 있다. 예를들어 this%is%my%string을 delimiter에 %를 넣어 StringTokenizer를 사용하면 마찬가지로 this, is, my, string으로 읽어준다.
  • this$%^is$my%string^일때 구획문자를 “$%^”라고 설정해주면 this, is, my, string 으로 끊어준다.
    String str = "this%%is%%my%%string"; 
    StringTokenizer st = new StringTokenizer(str,"%%"); 

    while(st.hasMoreTokens()) { 
        System.out.println(st.nextToken()); 
    }

같은 문제를 풀었을 때, Scanner와 BufferedReader를 사용했을 때의 처리속도차이

  • BufferedReader를 사용했을시, 92MS로 처리속도 단축. 이미지

  • 알고리즘 문제를 풀때, 입력이 몇개인지 주어지지 않는 경우 입력을 EOF(End Of File)까지 처리한다. eof를 사용함으로서 데이터가 없음을 알려줄 수 있다.
  • java에서는 while(sc.hasNextInt())를 사용함으로서 EOF 까지 입력을 받을 수 있음.(입력이 끝날때까지)
  • ^ : 뺀다는것
  • java readline, nextLine(한줄바로 입력받음)

출처

MySQL 재설치

|

인강을 따라가던중 MYSQL 커넥션에 에러가 생겼다.

  1. 한글처리 수정중
  2. MYSQL 서비스가 시작되지 않는 에러가 발생했다.
  3. mysql이 설치된 data파일을 백업해두지 않고 그냥 삭제해버렸고, mysql –initialize라는 명령어를 수행해도 data 폴터에 mysql 폴더(기존에 있었던)가 생성되지 않고 errr..이상한 파일들만 (?) 설치되었다.
  4. 서비스가 계속 실행되지 않고 뭔가 꼬인것 같아 처음부터 재설치를 하려고 한다.

  5. 인강은 41.26분까지 들음.

  6. 뭐가 꼬였는지는 모르겠는데 mysql 5.7.21버전으로 경로 새로만들고 재설치 후, my.ini은 수정하지 않고 테이블생성할때만 utg8설정을 따로 했을뿐인데 한글입력 후 테이블에 데이터 로우가 잘 추가된다. mysql 서버도 잘 실행된다.
  7. 오히려 my.ini에 mysqld하단에 character set을 추가하자 mysql 서비스실행이 에러와 함께 실행안되는 에러가 발생했다.(아까 해결못했던 그에러,,,)
# 추가하려고 했던 코드 
character-set-client-handshake=TRUE
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
collation-server = utf8_general_ci
default-collation = utf8_general_ci
default-character-set = utf8

출처