개발자가 되고 싶은 사람

redis와 pub/sub

|

redis

  • redis는 No SQL의 일종.
  • 대형포털들에서 static page, 또는 검색 결과 등을 캐쉬 하는데 많이 사용함.
    1. 처리속도가 빠르다.
  • 데이터가 메모리에만 저장되기 때문에 속도가 느린 disk를 거치지 않는다.
    1. 데이터가 메모리에만 저장된다.
  • 프로세스가 죽거나 장비가 shutdown되면 데이터가 사라진다.
    1. 만료일을 지정하여 만료과 되면 자동으로 데이터가 사라진다.
  • cache
    1. 저장소 메모리 재사용
  • 만료가 되지 않았더라도 더이상 데이터를 넣을 메모리가 없으면 LRU(Least recently used)알고리즘에 의해 데이터가 사라진다.

pub/sub

웹소켓 –> 서버

출처

180514_TIL

|

lombok

Lombok : 겟터, 셋터 자동 생성, 자칫 누락될 수 있는 생성자 매개변수 자동 set  생성

어노테이션

@Primary : 기본으로 등록되는 빈

implements RedisSerializer @RestController : Rest API를 만들 수 있다. 기존의 컨트롤러처럼 뷰를 만들어내는 것이 목적이아닌, 데이터처리를 위한 컨트롤러.

@CheckLoggedIn : 어노테이션도 커스텀 생성 가능한가?? addresscontroller

@CheckLoggedIn @SuppressWarnings(“unchecked”)

@RestController @RequestMapping(“${api.contextRoot}”)

@Data @Accessors(chain = true) –> set 과정에 연동되어 chain처럼 set값을 이룸… @Accessors(chain=true)는 Setter를 메서드 체인 역할을 해줍니다. (즉, 빌더패턴을 이용 할 수 있습니다.)

출처: http://dragonsilver.tistory.com/entry/Lombok을-아시나요 [어제 보다 나은 오늘의 나]

  • servlet : 클라 요청처리 하고 다시 결과를 클라에게 전송해줌

mac 단축키

  • 브라우저 자유 전환 및 반 칸만 활용.
  • 한영전환 : control space
  • 트랙패드 : 
미션 컨트롤 http://daitso.kds.co.kr/60651/
  • 복붙 : command + c/command + v
  • 글씨는 굵게 하고 싶다면 ⌘ Command+B 를 누른다
  • 글씨에 밑줄을 치려면 ⌘ Command+U 를 누른다
  • 모두 선택하려면 ⌘ Command+A 를 누른다
  • 잘라내기도 마찬가지로 쉽다. ⌘ Command+X 를 누른다  
  • 창 내리기 : ctrl + shift + 전원버튼
  • 활성화된 창들을 잠시 숨기기 : COMMAND + F3
  • 볼륨 : OPTION + SHIFT + F11/f12  
  • 대소문자 : caps lock 길게 
  • 브라우저 탭간 이동 :  ctrl + tab
  • 창 한개 닫기 : COMMAND + W
  • 창 여러개 닫기 : COMMAND + H
  • 맥 크롬 개발자도구 창 : option(alt) + cmd + i 
  • 전체창 : ctrl + command + f

  • 블록, 트랜젝션,,

블록체인 작업증명

작업증명(PoW, Proof-of-work)과 지분증명(PoS, Proof-of-stake)

pub/sub

  • 아래와 같이 비동기로 publish 처리하기 await Redis.publish(‘trade:init’, JSON.stringify(KeyCurrencyMarkets.getAllOrderCall()));

  • 그리고 sub로 받기

  • Map : 이렇게 쓰는 것두 처음보는 것 같은데…

Spring-Security 와 보안

|

보안이란?

이미지

  • 위의 두 단어는 스프링 시큐리티 뿐만이 아니라 일반 보안에서도 핵심 축
  • Authentication : 인증, Authorization : 권한부여 (서로 다른 단어!!!!!)

인증의 종류

1. 크리덴셜(Credential:자격) 기반 인증 - 웹에서 사용하는 대부분의인증 방식은 크리덴션 기반의 인증 방식. 즉 권한을 부여받는데 1차례의 인증과정이 필요하며 대개 사용자명과 비밀번호를 입력받아 입력한 비밀번호가 저장된 비밀번호와 일치하는지 확인합니다. 일반적으로 스프링 시큐리티에서는 아이디를 프린시플(principle), 비밀번호를 크리덴셜(credential)이라고 부른다.(스프링 시큐리티를 이용해 구현해나갈 인증(Authentication))

2. 이중 인증(Two-factor authentication) - 한번에 2가지 방식으로 인증을 받는 것. 예를 들어 금융, 은행 웹어플리케이션을 이용해 온라인 거래를 하실 때에는 로그인과 보안 인증서, 2가지 방법으로 인증을 받는다.

3. 물리적인 인증 - 웹의 영역을 벗어난 것이지만 가장 효과적인 보안 수단 중에 하나. 지문인식 혹은 키 삽입 방법.

권한부여(Authorization)

1. 부여된 권한(Granted Autority) - 적절한 절차로 사용자가 인증되었다면 권한을 부여(Granted Authority)해야 한다. 회원가입 등을 통해 반영구적인 권한이 부여됬다면 우리는 이 회원에게 부여된 권한을 어딘가에 저장해야 한다. 만약 해당 사용자가 로그인을 했는데 메인 페이지로 넘어갈 수 없다면 권한부여에 문제가 있다는 것.

2. 리소스의 권한(Intercept) - 사용자의 권한만 있다고 보안이 제대로 동작할리는 없다. 보안이란 본래 권한이 없는 자들이 원천적으로 리소스에 접근할 수 없도록 막아내는 것이기 때문입니다. 그런 의미에서 적절한 권한을 가진자만 해당 자원에 접근할 수 있도록 자원의 외부요청을 원천적으로 가로채는 것(Intercept)이 웹보안, 그 중 권한부여(Authorization)의 핵심 원칙이라 할 수 있겠습니다.

  • 어떤 방식으로 권한을 부여할지, 해당 리소스에 어떻게 권한수준을 부여하고, 인증받은 정보를 어떻게 지속적으로 유지할 수 있을지에 대한 여러 이슈들을 스프링 시큐리티는 10년가까이 연구하며 발전한 보안 프레임워크이고 보안 개념이 없는 자가 보안이 필요한 쇼핑몰이나 주요 웹사이트를 설계했다고 가정했을 때 발생할 막대한 피해들을 방어할 수 있는 최선의 선택이라고 한다….

리소스의 권한(Intercept)

  • 보안에서 리소스에 접근권한을 설정하는 것이 바로 Intercept 방식으로 작동하고 있다.
  • 아무리 서버 성능이 좋고 직원이 많더라도 가지고 있는 모든 리소스에 일일이 권한을 설정할 수는 없는 노릇이다. 대신에 @MVC에서 보았듯 DispatcherServlet처럼 클라이언트의 요청을 가로챌 수만 있다면 간단히 문제를 해결할 수 있을 것이다.

이미지

  • 스프링 시큐리티는 @MVC의 DispatcherServlet이나 AOP를 이용해 프록시를 생성하지 않고 아주 오래 전부터 사용해온 고유의 DelegatingFilterProxy 클래스를 사용.
  • web.xml에 DelegatingFilterProxy를 등록
  <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>
  
  • 여기서 주의할 점은 <filter-name>의 값이 반드시 springSecurityFilterChain이어야 한다는 점입니다. 왜 꼭 이름을 springSecurityFilterChain으로 지어야 하냐면 DelegatingFilterProxy 클래스는 setTargetBeanName(String)이라는 메서드를 갖고 있는데 이 메서드는 실제 요청을 처리할 필터를 주입받습니다. 만약 이 메서드를 통해 구현할 필터빈을 주입받지 못한다면 DelegatingFilterProxy 클래스는 기본값으로 <filter-name>의 값과 동일한 빈이 스프링 컨텍스트에 존재하는지를 검색하게 됩니다.

출처

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

|

로그인 페이지 커스터마이징

  • <form-login> 요소를 이용하면 손쉽게 로그인 페이지를 커스터마이징할 수 있다.
  • security-context.xml 에 아래와 같이 지정.
  
<http auto-config='true' >
<form-login login-page="/loginForm.html" authentication-failure-url="/loginForm.html?ng" />
<intercept-url pattern="/login.html*" access="ROLE_USER"/>
<intercept-url pattern="/welcome.html*" access="ROLE_ADMIN"/>
</http>

클라이언트요청을 처리하기 위한 컨트롤러

  
@RequestMapping("/login.html")
public String login(Locale locale, Model model){
  
 return "security/login";
}

@RequestMapping("/welcome.html")
public String welcome(Locale locale, Model model){
  
 return "security/welcome";
}

@RequestMapping("/loginForm.html")
public String loginForm(Locale locale, Model model){
  
 return "security/loginForm";
}

view구성

  • loginForm.jsp
  <h1>loginForm.jsp</h1>
  <c:url value="j_spring_security_check" var="loginUrl"/>
  <form action="${loginUrl}" method="post">
  	<c:if test="${param.ng != null}">
  	<p>
  		LogIn NG! <br />
  		<c:if test="${SPRING_SECURITY_LAST_EXCEPTION != NULL}">
  			message : <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />
  		</c:if>
  	</p>
  	</c:if>
  	ID : <input type="text" name="j_username"> <br />
  	PW : <input type="text" name="j_password"> <br />
  	<input type="submit" value="LOGIN"> <br />
  </form>
  
  • login.jsp : 태그라이브러리 추가 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://www.springframework.org/security/tags" prefix="s" %>
  <h1>login.jsp</h1>
  <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 />

출처

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)한다.
  • 먼저 인증받을 사용자의 아이디와 비밀번호를 입력한 뒤에 해당 사용자에게 권한(ROLEUSER)를 부여한다. 가급적 **‘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 />

출처