[ JWT.json web token-기본 개념  ]


1. 표준규약

   - SON Web Token (JWT) 은 웹표준 (RFC 7519) 으로서 두 개체에서 JSON 객체를 사용하여
      가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달해 준다.


2. 지원언어

   - Java, Python, C++, R, C#, PHP, JavaScript, Ruby, Go, Swift 등


3. 자가 수용적 (self-contained) 

   - JWT 는 필요한 모든 정보를 자체적으로 지니고 있다. 

      JWT 시스템에서 발급된 토큰은, 토큰에 대한 기본정보, 

      전달 할 정보 (로그인시스템에서는 유저 정보를 나타냄) 

      그리고 토큰이 검증됐다는것을 증명해주는 signature 를 포함하고 있다.


4. 각 Layer간 전달방식 두 가지

    - 참고, 자구용적으로 두 개체 사이에서 손쉽게 전달 가능.

    1. HTTP 헤어에 넣어서 전달 가능

    2. URL의 파라미터로 전달 가능


5. 안드로이드 보안

   1. 세션과 쿠키는 모바일 어플리캐이션에서 make sense하지 않다. 

      서버에서 생성된 세션과 쿠키를 모바일 클라이언트에서는 공유할 수 없다.

   2. 현재 어플리케이션에서 렌더링된 HTML이 반환되었다. 

      모바일 클라이언트에서는 JSON 또는 XML와 같은 포맷의 응답이 필요하다.

   3. 위 두 가지 사유로 안드로이드 보안은 JWT가 좋다.


6. JWT 생성 및 사용방법

   1. Client : 사용자가 Login

   2. Server : 유저의 정보를 기반으로 토큰을 발급하여 Client에 전달.

   3. Client : 각 업무화면에서 서버에 정보요청 할 때 마다 JWT를 포함하여 전달.

   4. Server : Client에게서 요청을 받을 때 맏, JWT 토큰이 유효하고 인증됐는지 검증

                업무요청단계부터는 JWT를 client전달할 필요 없고

                요청한 업무자료만 넘겨주면 됨

   - 이방식으로하면 서버에서는 Session관리가 필요 없어 자원을 많이 아낄 수 있다.


7. JWT 구조

   1. 항목 : 헤더(header),   내용(payload),  서명(signature)

   2. 구조 예) 헤더(header) 내용(payload) 서명(signature)

                 - 각 항목별로 중간에 (.)을 이용해서 결합


8. JWT-헤더(header)

   1. 존재이유 : ???

   2. 항목 : typ, alg

   3. typ - 존재 이유 : ??

          - 정의 :   토큰 타입을 지정   (예, JWT)

      alg - 존재 이유 : ?? 

          - 정의 : 해싱 알고리즘을 지정

                   해싱 알고리즘이란 보통 'HMAC SHA256' 혹은 'RSA'가 사용되며,

                   이 알고리즘은, 토큰을 검증 할 때 사용되는 signatur부분에서 사용됨

   4. 예) 

 

 {
   "typ" : "JWT",

   "alg": "HS256"

 }


9. JWT-내용(payload)

   1. 존재이유 : ???

   2. 정보 : 토큰에 담을 정보. 이 정보의 한 '조각'을 클레임(claim)이라고 한다.

             이 claim은  name/value의 한 쌍으로 이뤄져 있고 여러개 넣을 수 있다.

   3. 항목 - 등록된 (registered) 클레임,

              공개 (public) 클레임,

              비공개 (private) 클레임

   4. 등록된 (registered) 클레임

      a. 정의 : 등록된 클레임들은 서비스에서 필요한 정보들이 아닌, 

                토큰에 대한 정보들을 담기위하여 이름이 이미 정해진 클레임들이다. 

                등록된 클레임의 사용은 모두 선택적 (optional)이다.

      b. 항목 : iss,  sub,  aud,    exp,    nbf,   iat,    jti

      c. 항목 정의

 

 iss

 토큰 발급자 (issuer)

 

 sub

 토큰 제목 (subject)

 

 aud

 토큰 대상자 (audience)

 

 exp

 토큰의 만료시간 (expiraton), 시간은 NumericDate 형식으로 되어있어야 하며 

  (예: 1234567890123) 언제나 현재 시간보다 이후로 설정되어있어야함.

 

 nbf

 Not Before 를 의미하며, 토큰의 활성 날짜와 비슷한 개념이다.

 여기에도 NumericDate 형식으로 날짜를 지정하며, 

 이 날짜가 지나기 전까지는 토큰이 처리되지 않는다.

 

 iat

 토큰이 발급된 시간 (issued at), 

 이 값을 사용하여 토큰의 age 가 얼마나 되었는지 판단 할 수 있다.

 

 jti

 JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용된다. 

 일회용 토큰에 사용하면 유용하다.


   4. 공개 (public) 클레임

      a. 정의 : 공개 클레임들은 충돌이 방지된 (collision-resistant) 이름을 가지고 있어야 한다.

         그래서 보통 클레임 이름을 URI(도메인) 형식으로 짓는다.

      b. 예)

 

 {
   "https://farmerkyh.tistory.com":true

 }


   5. 비공개 (private) 클레임

      a. 정의 : 등록된 클레임도아니고, 공개된 클레임들도 아니다.

                양 측간에 (보통 클라이언트 <->서버) 협의하에 사용되는 클레임 이름들이다. 

                공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할때에 유의해야한다.

      b. 예)

 

 {
   "userNo":"1234"

 }



10. JWT-내용(payload) - 예제


 

 {
   "iss":"farmerkyh.tistory.com",

   "exp":"1234567890123",

   "https://farmerkyh.tistory.com":true,

   "userNo":"3939",
   "userName":"농부지기"

 }



11. JWT-서명(signature)

   1. 존재이유 : ???

    2. 정의 : 이 서명은 헤더의 인코딩값과, 정보의 인코딩값을 합친 후 주어진 비밀키로 해쉬를 하여 생성한다.

              서명 부분을 만드는 슈도코드(pseudocode)의 구조는 다음과 같다.

 

 HMACSHA256(
                  base64UrlEncode(header) + "." +
                  base64UrlEncode(payload),
                  secret
                 )


              이렇게 만든 해쉬를, base64 형태로 나타내면 된다.

              (문자열을 인코딩 하는게 아닌 hex → base64 인코딩을 해야한다.)










'Web. 기타 언어 > JWT' 카테고리의 다른 글

jwt. 참고 URL  (0) 2017.02.05
Posted by 농부지기
,

[ jwt. 참고 URL ]

 

  1. 기본 개념 : REST JWT(JSON Web Token)소개 - #1 개념 소개
  2. 기본 개념 : JWT 기본 개념 소개
  3. https://jwt.io/
  4. https://jwt.io/introduction/
  5. https://github.com/auth0/angular2-jwt
  6. http://bcho.tistory.com/999
  7. https://blog.outsider.ne.kr/1160
  8. http://opennaru.tistory.com/94
  9. http://blog.aliencube.org/ko/2015/02/12/can-json-web-token-jwt-alter-session-object/
  10. https://github.com/devkimchi/JWT-Authentication





 

  1. java           : java용 jwt 예제 (stackoverflow)
  2. java           : java용 jwt 예제 (ibm에서 작성)
  3. java           : java용 jwt 예제 (소스 일부 예제)
  4.                    java용 jwt 예제 (소스 전체 존재.Package 포함)
  5. javaScript : 안드로이드용 jwt설명 및 관련 예제
  6. android    : java <->안드로이드용 jwt예제만 (어려움)
  7. javaScript  : 기본 개념 및 javaScript 관련 예제
  8. php             : 기본 개념 및 php 관련 예제







'Web. 기타 언어 > JWT' 카테고리의 다른 글

JWT.json web token-기본 개념  (0) 2017.02.08
Posted by 농부지기
,

[ myBatis.oracle.sql.CLOB@  결과 오류시 ]



 

오라클 함수중 WM_CONCAT()  함수를 사용하면 기본적으로 VARCHAR type으로 return한다.
그런데,  결과값이 너무 길 경우 오라클은 CLOB type으로 return하게 되고,
myBatis, JAVA에서는 CLOB type이 없기 때문에 최종결과는 "oracle.sql.CLOB@  ..."와 
같은 오류값이 RETURN 된다.

해결방법 : 원래 clob type을 string으로 변환하는 Mybatis 구문이 있지만 이상하게 
                 WM_CONCAT()함수 결과 컬럼에 대해서는 적용되지 않는다.
                그래서 TO_CHAR( WB_CONCAT(. ... ) ) 와 같아 . TO_CHAT()함수로 묶어 준다.
                문약, TO_CHAR()함로도 안되면  TO_CHAR(SUBSTR(컬럼명, 1, 2000)) AS 컬럼명
                과 같이 SUBSTR(0함수도 사용하면 된다.

<sqlMap namespace="BPPA0080">
    <
select id="selectShopList"  parameterClass="java.util.HashMapresultClass="java.util.HashMap" >
        SELECT /* BPPA0080.shopList */
              AREA2_CLS_CD
            , AREA2_CLS_NM
            , SHOP_CLS_NM
            , TO_CHAR(SUBSTR(BEF_YY_LIST, 1, 4000)) AS BEF_YY_LIST
            , TO_CHAR(SUBSTR(NEXT_YY_OPEN_LIST, 1, 2000)) AS NEXT_YY_OPEN_LIST
          FROM TABLE_NAME
    </
select>
</
sqlMap>

 


'Web. 기타 언어 > myBatis' 카테고리의 다른 글

myBatis. if. case 문  (0) 2017.12.05
myBatis에서 foreach 사용하기  (0) 2017.06.09
myBatis.CLOB Column type  (0) 2017.01.31
myBatis.SQL문 안에서 <, > 사용  (0) 2017.01.31
myBatis.xml Tag  (0) 2017.01.31
Posted by 농부지기
,

[ myBatis.CLOB Column type ]


 

 
 

/* --------------------------------------------------------------------------------------------- */
/*  Mybatis에서는 조회SQL 문장에서 CLOB 컬럼을 조회하면 이 CLOB TYPE에 대한 형(type)이 없다.     */
/*  그래서 CLOB TYPE에 대한 컬럼 결과를 String 형(type)으로 변환하는 구문이 필요하다.            */
/* --------------------------------------------------------------------------------------------- */

<
sqlMap namespace="CMLO0040">

    <
resultMap id="clobHashMapclass="java.util.HashMap">   
        <
result property="SQL_FULLTEXTcolumn="SQL_FULLTEXTjdbcType="CLOBjavaType="java.lang.String"/>
    </
resultMap>

    <
select id="selectSqlparameterClass="java.util.HashMap" resultMap="clobHashMap" >
        SELECT /* CMLO0040.selectSql */
               SQL_FULLTEXT
          FROM TCM_LOG_DB
         WHERE NO = #NO#
    </
select>
       
</
sqlMap>


'Web. 기타 언어 > myBatis' 카테고리의 다른 글

myBatis에서 foreach 사용하기  (0) 2017.06.09
myBatis.oracle.sql.CLOB@ 결과 오류시  (0) 2017.01.31
myBatis.SQL문 안에서 <, > 사용  (0) 2017.01.31
myBatis.xml Tag  (0) 2017.01.31
myBatis XML 기본 문법  (2) 2017.01.31
Posted by 농부지기
,

[ myBatis.SQL문 안에서 <, > 사용 ]



 

 

SQL문 안에서 <, > 사용할때 정상적으로 처리는 된것 같은데, dataset을 리턴받아서 처리를 못할수 있습니다.
  
이때  <를 〈로 >를 〉로 바꿔서 쓰시면 정상적으로 작동합니다.(ascii)
 
SQL문장안에 <, >을 사용한 경우이고 db에 있는데 데이터를 가져올때는 해당되지 않습니다.
 
select '신한법인카드<-엘지법인카드'
from dual


'Web. 기타 언어 > myBatis' 카테고리의 다른 글

myBatis에서 foreach 사용하기  (0) 2017.06.09
myBatis.oracle.sql.CLOB@ 결과 오류시  (0) 2017.01.31
myBatis.CLOB Column type  (0) 2017.01.31
myBatis.xml Tag  (0) 2017.01.31
myBatis XML 기본 문법  (2) 2017.01.31
Posted by 농부지기
,

[ myBatis.xml Tag ]


 

 

정의 : sql 문장을 만들경우 java단에서 값을 넘겨서 ibatis framework에서 받아 주는 구문
 
1. java단에서 넘긴 값 받기 (##)
   - 정의방법   : 
WHERE COMP_CD = #compCd# 
   - 최종실행문 : 
WHERE COMP_CD = '101'
   - 설명 : ##으로 받은 argument는 String으로 인식하여 (')single quote를 양쪽으로 붙여 준다.
   - 사용 : Table column type이 String일 경우에 사용함. (숫자 type도 가능함)
 
2. java단에서 넘긴 값 받기 ($$)
   - 정의방법    : 
SELECT $COL_LIST$
                                    ...

                        
WHERE COMP_CD IN ($compCd$)
                           
OR EMP_ID IN ($compCd$)
   - 최종실행문 : 
SELECT COMP_CD, COMP_NM, EMP_ID, EMP_NM, SALARY
                                    ...
                        
WHERE COMP_CD IN ('101', '103', '104')
                           
OR EMP_ID IN (1301, 55401, 4421)
   - 설명 : $$로 받은 argument는 java단에서 넘겨 받은 값을 그대로 넣어 준다.
   - 사용 : Table column type이 number일 경우에 사용
   -       sql 문장중 in 구문에 사용
   -       컬럼 LIST를 dynamic하게 사용하고 싶을 경우에 사용
   -       sql 문장을  dynamic하게 사용하고 싶을 경우에 사용

3. 조건절에 대소 비교(<>)가 존재 시
    - <
![CDATA[ AND RETIRE_YN <> 'Y'   ]]>   
    - <
![CDATA[ AND B.ACCT_CD >= #csSAcctCd_edtCode# ]]>  


4. 값이 null이면 해당 sql 문장 skip
   - 정의 : <
isNotNull property="cmbSlpmCtg" >
               </
isNotNull>

               <
isNull property="cmbSlpmCtg" >
               </
isNull>

5. if 문장
   - 정의 : <
isNotEqual property='rdoApvYn' compareValue='0'>
               AND A.APPR_DT IS NULL
            </
isNotEqual>
           
            <
isEqual property='rdoApvYn' compareValue='1'>
            </
isEqual>

 

 

  

 

'Web. 기타 언어 > myBatis' 카테고리의 다른 글

myBatis에서 foreach 사용하기  (0) 2017.06.09
myBatis.oracle.sql.CLOB@ 결과 오류시  (0) 2017.01.31
myBatis.CLOB Column type  (0) 2017.01.31
myBatis.SQL문 안에서 <, > 사용  (0) 2017.01.31
myBatis XML 기본 문법  (2) 2017.01.31
Posted by 농부지기
,

[ ◎ myBatis XML 기본 문법 ]     


1. xml 정의

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
        

2. 주석

 


    참고 : 이때 '-'를 여러개 정의하면 오류 발생 (예, '-----------------------')
        <!--
            SQL File Name : BPSL0060_SQL.xml
            Description   : 판매수수료율 계획 관리
            ==개정이력========================================
            수정일         수정자     Version    Query Id
            ========== ======= =========   ===================
            2013.12.18 김용학    1.0         최초 생성
        -->    

    

3. sqlMap Tag 시작

 

<sqlMap namespace="BPSL0060">

4. xml tag중 Alias 정의

 


  parameterClass등의 값을 정의 시 이 Alias를 사용해서 가능한다.

     <
typeAlias alias="BPMap" type="java.util.HashMap"/>
     <
typeAlias alias="CVo"   type="kr.co.descentekorea.common.vo.CommonVO"/>
     <
select id="selectSeasonList"  parameterClass="BPMap" resultClass="BPMap" >
              ....
     </
select>
 

5. select 문장

 


 id : 해당 select구문 id
 parameterClass : sql select 구문 작성시 argument로 받은 상수들에 대한 Object type정의
 resulClass       : sql select 결과를 어떤 Object type로 return할지에 대한 정의

  <
select id="selectSeasonList"  parameterClass="java.util.HashMap" resultClass="java.util.HashMap" >
      ...
  </
select>
 

6. select 문장

 


 remapResults :
   iBatis는 하나의 SELECT절에 대해서 첫 번째 조회 시 Column List와 Column Type등을 메모리에
   가지고 있다. 두 번째 부터는 이 컬럼목록 과 타입을 이용해서 처리 된다.
   이로 인해 다시 컬럼목록과 타입을 재 분석하는 속도를 향상시킬 수 있다.

   문제는, PIVOT함수나 Dynamic SQL 문장등으로 조회할 때 마다 컬럼목록이 매번 달라지거나 컬럼 타입등이
   변경된다면 첫 번재 조회된 컬럼목록과 타입으로 처리 되므로 client단에서 자료를 받아서 사용할 때 문제점
   이 발생 된다.

   해결방안은 
remapResults="true" 을 사용하여 매번 SELECT 할 때마나 컬럼목록과 타입을 재 분석하여
   사용하게 된다.

   <
select id="selectCommissionList"  parameterClass="java.util.HashMap" resultClass="java.util.HashMap"
                                 
remapResults="true" >
            .............

   </select>

7. insert 문장

 


 - MERGE 문장도 이곳에 구현 가능하다.

   <
insert id="saveCommission" parameterClass="java.util.HashMap">
         ....
   </
insert>
 

8. Update 문장

 


   <
update id="deleteCommission" parameterClass="java.util.HashMap">
           ............
   </
update>

9. Procedure 문장 호출

 

- parameterMap id="cVO"  는 아래 procedure Tag의 parameterMap="cVO" 과 동일 해야 된다.
- javaType : ㄱ. java단에서는 Object, 또는 String으로 넘기면  
             ㄴ. ibatis는  java.lang.String 으로 모두 받는다.
             ㄷ. 그런후 Procedure에서는 해당 인자를 받는다.
                 이때 ibatis에서 String으로 넘겨도 Procedure 에서는 VARCHAR2 또는 NUMBER 로 
                 정의 해도 모두 수용한다.
- mode : IN, OUT (input, return)정의
- procedure id="planCopy"   이 id를 가지고 java단에서 호출함

   <
parameterMap id="cVO" class="kr.co.descentekorea.common.vo.CommonVO">
       <
parameter property="map.gv_compCd"   javaType="java.lang.String" jdbcType="VARCHAR" mode="IN" />
       <
parameter property="map.ORG_PLAN_YY" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN" />
       <
parameter property="map.ORG_PLAN_CD" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN" />
       <
parameter property="errorFlag"       javaType="java.lang.String" jdbcType="VARCHAR" mode="OUT" />
       <
parameter property="errorMessage"    javaType="java.lang.String" jdbcType="VARCHAR" mode="OUT" />

   </
parameterMap>
   <
procedure id="planCopy" parameterMap="cVO">
          { CALL /* BPCM.사업계획 차수 복사  */ 
                   SP_BP_PLAN_COPY(?,?,?,?     ,?,?,?    ,?,?,?,?)
           }
   </
procedure>
   


  

'Web. 기타 언어 > myBatis' 카테고리의 다른 글

myBatis에서 foreach 사용하기  (0) 2017.06.09
myBatis.oracle.sql.CLOB@ 결과 오류시  (0) 2017.01.31
myBatis.CLOB Column type  (0) 2017.01.31
myBatis.SQL문 안에서 <, > 사용  (0) 2017.01.31
myBatis.xml Tag  (0) 2017.01.31
Posted by 농부지기
,

[ 5. Devon SQL - IN 조건 ]


1. 정의

   sql문장에서 in조건에 몇건이 올지 모른다.

   그래서 ArrayList를 이용해서 값을 넣고,  sql단에서 iterate와 conjuction을 이용해서 in조건을 완성한다.


2. java단

 

3. sql단


4. 별도 방법 도 존재 함

   - dynamic sql문장을 이용해도 됨

   - java단

     . vo.setColId1("'a','c','d'");

   - sql단
     . where  컬럼1 in (${colId1:unchecked})


'Web. 기타 언어 > Devon-SQL' 카테고리의 다른 글

4. Devon SQL Procedure 호출 (테이블용)  (0) 2017.01.25
3. Devon SQL Procedure 호출  (0) 2017.01.25
2. Devon IF 문장  (7) 2017.01.25
1. Devon SQL 변수 처리  (4) 2017.01.25
Posted by 농부지기
,

[ 4. Devon SQL Procedure 호출 (테이블용) ]


1. 정의 

   - sql문장 from절에 Procedure_name을 놓고,  이 Procedure가 수행하고 결과가 레코드로

     받으면 테이블처럼 된다.

 

2. SQL 사용예)


3. From절에 위치할 Function 예) - name : get_parameter_list_copy

 


4. From절에 위치할 Function 예) - name : seperate_data_return_table



'Web. 기타 언어 > Devon-SQL' 카테고리의 다른 글

5. Devon SQL - IN 조건  (0) 2017.01.25
3. Devon SQL Procedure 호출  (0) 2017.01.25
2. Devon IF 문장  (7) 2017.01.25
1. Devon SQL 변수 처리  (4) 2017.01.25
Posted by 농부지기
,

[ 3. Devon SQL Procedure 호출 ]


1. SQL문장 기술 방법

    <statement name="doProcedureCall">

        {call pkg_nm.pl_program_parameters( ${pkId:integer:inparam}

                                                  , ${o_errmsg:string:outparam}

                                                 , ${o_retcode:integer:outparam})}

    </statement>


2. dao단에서 procedure 호출 Method

   LData result = dao.executeQueryProcedure(sQueryPath, paramData);





'Web. 기타 언어 > Devon-SQL' 카테고리의 다른 글

5. Devon SQL - IN 조건  (0) 2017.01.25
4. Devon SQL Procedure 호출 (테이블용)  (0) 2017.01.25
2. Devon IF 문장  (7) 2017.01.25
1. Devon SQL 변수 처리  (4) 2017.01.25
Posted by 농부지기
,