반응형

공식 참고 사이트: https://github.com/jwtk/jjwt

              1. dependencies 추가              

Gradle

dependencies {
    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5',
    // Uncomment the next line if you want to use RSASSA-PSS (PS256, PS384, PS512) algorithms:
    //'org.bouncycastle:bcprov-jdk15on:1.70',
    'io.jsonwebtoken:jjwt-jackson:0.11.5' // or 'io.jsonwebtoken:jjwt-gson:0.11.5' for gson
}

 

여기서 잠깐! JJWT Dependencies 에 대해 초큼 알아보자

dependency의 선언을 보면, 한개만 compile-time dependency 이고, 나머지는 runtime으로 선언되어있다.

이것은, JJWT는 오직 설계한 application에 명시되어있는 APIs 에 의존하도록 설계가 되어있고,  경고 없이 변경될 수 있는 기타 모든 내부 구현 세부 정보는 runtime전용 종속성으로 분류되기 때문입니다. 이건, 만약 안정적인 JJWT사용이나 업데이트를 위해서는 매우 중요하다!

만약, jjwt-impl.jar 를 추가해서 사용한다면, jjwt에 업데이트가 있거나 수정사항이 있을 경우에 자동으로 compativility 되지 않을 거라는 경고도 되어있다. 그래서 jjwt-impl.jar 를 compile scope (implementation)에 넣지 말고 runtime scope에 넣으라고 되어있다.

반응형
              2. Token 생성해보기              
import java.util.Date;
import java.util.UUID;

import io.jsonwebtoken.Jwts;

public class JwtUtils {
	
	public static String createJWT() {
		Date now = new Date();
		Date expiredAt = new Date(now.getTime() + 10 * 60 * 1000);	// 유효시간 10분
		String jwtToken = Jwts.builder()
				.claim("name", "minah")
				.claim("email", "mapark@abc.co.kr")
				.setSubject("user")
				.setId(UUID.randomUUID().toString())
				.setIssuedAt(now)
				.setExpiration(expiredAt)
				.compact();
		return jwtToken;
		
	}
			
}

해석해보면,

name 에 minah를, email 에 mapark@abc.co.kr 을 각각 넣어둔것. user이라는 subject로 

token의 유효시간은 10분으로해서 compact 를 해둠.

그래서 로그를 찍어보니,

이렇게 잘 찍혓다. 그러면 이제 이걸 다시 재해석... 해야지?

 

              3. Token 재해석하여 보낸 데이터 확인              

재해석을 하는 과정에서,Jwts 의 parserBuilder() 를 이용하는데, 이제 어떠한 키를 가지고 해석해내지 않으면 할 수 없다고 에러가 떳다. 그래서 key 를 지정해서 jwt 를 생성하고, 그 key 를 가지고 재해석하는 과정을 넣었다.

수정한 메서드

import java.security.Key;
import java.util.Date;
import java.util.UUID;

import javax.crypto.SecretKey;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

public class JwtUtils {
	
	static Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
	
	public static String createJWT() {
		Date now = new Date();
		Date expiredAt = new Date(now.getTime() + 10 * 60 * 1000);	// 유효시간 10분
		String jwtToken = Jwts.builder()
				.claim("name", "minah")
				.claim("email", "mapark@abcd.co.kr")
				.setSubject("user")
				.setId(UUID.randomUUID().toString())
				.setIssuedAt(now)
				.setExpiration(expiredAt)
                // 지정한 key 로 sign 하겟다라는 설정
				.signWith(key)
				.compact();
		return jwtToken;
		
	}
	
	public static Jws<Claims> parseJwt(String jwtString){
		Jws<Claims> jwt = Jwts.parserBuilder()
				.setSigningKey(key)
				.build()
				.parseClaimsJws(jwtString);
		return jwt;
	}
			
}

그래서 다시 확인해봤다.

parse jwtTest에, 내가 넣어두었던 name, email, sub 모두가 나왔다. 

다음 글에서는 vue.js에서 로그인해서 token을 header로 보내는 과정을 구현해보겠다.

반응형
반응형

JWT를 구현하기 위해 JWT 공식사이트(https://jwt.io/libraries?language=Java)에 들어가서 확인하는 중에, 발견한 것이 Java에서 사용할 경우, 여러가지의 라이브러리가 있었는데, 내가 알아본 예제들은 대부분, io.jsonwebtoken 을 사용했거나, ,com.auth0을 사용했다. 그래서 그 둘의 차이를 알아봤다.

반응형

Auth0 이란?

이름에서도 알 수 있다시피, authentication과 authorization에 관한 application 이다. 

어떤 경우에 Auth0을 사용할 수 있냐 :

- JavaScript 로 front-end app을 만들고, API의 access를 안전하게 하고 싶다면 사용 가능하다.
- SAML로 접근, 권한 설정을하는 web app을 만든다. 
SAML (Security Assertion Markup Language) 프로토콜은 open-standard, xml-based 프레임워크 에서의 authentication 과 authorization을 비밀번호 없이 관리할 수 있다. Auth0은 SAML 을 서포트해준다. 
- 사용자가 비밀번호가 아닌 이메일이나 SMS 로 보내진 one-time codes로 로그인하게 하고 싶다
.

여기서, Auth0 을 검색할때마다 OAuth 도 같이 나오는데, 차이가 뭔지 보면,

OAuth 2.0: 모든 소프트웨어(windwos, mobile 또는 web)의 인증을 위한 기준 또는 프로토콜
Auth0:  OAuth 2.0 프로토콜을 사용, 구현하는 소프트웨어 상품

즉, Auth는 OAuth 의 구현체 라고 나는 이해했다.

그래서, 알아본 OAuth

OAuth 란,
- google, github, 카카오톡 등 서비스에 인증을 맡기고, 접근 권한 관리만을 수행하는 인증방식

https://auth0.com/docs/get-started/authentication-and-authorization-flow/authorization-code-flow


JJWT는 JVM이 제공하는 JWT 토큰 생성  JWT 토큰 파싱, 검증을 해주는 라이브러리 입니다.

그래서, 결국 나는 JJWT를 이용할 것이다. 왜? 아이디와 비번으로 로그인을 구현할 것이기때문이다.

반응형
반응형

프로젝트를 진행 중에, spring security 를 이용해서 로그인을 하는 과정에서 로그인을 성공한 후에 jsp 로 로그인한 정보를 보내는 과정을 뒤져보는 과정에서 발견한 방법!!!

그건 HttpServletResponse 의 printWriter를 이용한 방법이었다. 

 

1. login.jsp

ajax를 이용하여 spring security 를 이용하여 로그인 프로세스를 타게 했다.

$.ajax({
    url: './loginCheck',
    data: datas,
    type: 'POST',
    dataType: 'json',
}).done(function(body) {
    console.log(body);
    var error = body.response.error;
});

login 로직을 탄 후에 받아오는 데이터 타입을 json으로 정의를 해두었다. 그래서 java에서도 보내는 데이터타입이 json 형태이어야한다. 아니면? 에러뜸!!! 주의해야함

 

2. AuthenticationSuccessHandlerImpl.java

로그인 로직이 성공했을 때 타게 spring-security.xml 에 설정해둔 implement 에 있는 메서드에 response를 받아오는 변수로 넣어두고 reponse.getWriter().print() 를 이용하여 위에 설정해둔 ajax의 결과값에 보내보자!

※주의! contentType, characterEncoding 을 설정해주어야하고,  print할 데이터는 꼭! json 값이어야함!! 아니길원하면 ajax 의 dataType 을 원하는 타입으로 수정하면 된다.

public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication auth) throws IOException, ServletException {
	String rUrl = defaultUrl;
    res.setContentType("application/json"); 
    res.setCharacterEncoding("utf-8"); 
    
    String data = "{\"response\":{\"error\":false,\"url\":\""+rUrl+"\", \"id\": \""+"userId"+"\", \"role\": \""+"roleId"+"\"}}";
	PrintWriter out = res.getWriter();
    out.print(data);
}

 

3. 로그인 후, console 확인

response object가 보내졌고, 보낸 data가 console에 찍혀있는걸 확인할 수 있다!!!!!

 

반응형

 

반응형
반응형

1. AES-256 란?

- AES (Advanced Encryption Standard)는 고급 암호화 표준 이라는 의미이며, 암호화와 복호화 과정에서 동일한 키를 사용하여 대칭 키 알고리즘이다.

- 128비트 암호화 블록, 다양한 키의 길이 (128/192/256 비트)를 갖춘 대칭형 암호 알고리즘이다.

- AES-128, AES-192, AES-256 (키의 길이 16byte, 24byte, 32byte)

 

2. 대칭키 암호 알고리즘

- 하나의 키로 암호화와 복호화를 모두 수행하는 것을 말한다. 그래서 이 키는 절대로 외부에 유출되지 않도록 관리해야 하여 비밀키(Secret Key) 라고 부른다.

- 구조가 단순하여 대칭키에 비해 암호화와 복호화 속도가 빠르지만, 교환 당사자간에 동일한 키를 공유해야 하기 때문에 키 관리의 어려움이 있다.

3. AES 암호화 설명

1) Secret Key

- 평문을 암호화하는데 사용 (외부로 유출되면 안됨)
- AES의 종류에 따라 Secret Key의 길이가 달라짐 ( AES-256 은 256비트 즉, 32바이트 의 키를 사용)

2) Block Cipher

- AES는 128비트(16바이트)의 고정된 블록 단위로 암호화를 수행 -> 이 암호화를 수행할 때 여러가지 Block Cipher Mode (CBC - 권장함, ECB)를 선택할 수 있음. 
- 패딩: 128비트보다 작은 블록이 생길 경우 부족한 부분을 특정한 값으로 채우는 작업

3) CBC (Cipher Block Chaining) mode encrption

- AES는 128비트(16바이트)의 고정된 블록 단위로 암호화를 수행 하는데, CBC는 블록을 그대로 암호화하지않고 이전에 암호화했던 블록과 XOR 연산을 한 다음에 암호화를 수행
- 첫번째 블록은 이전 암호화 블록이 없기 때문에 이를 위해 IV(initialization vector)를 이용
반응형

 

반응형
반응형

따로 java파일을 빼놓고 그 java만 실행하고 싶다면,

일단 확장자 .java 라 저장하고, 

main 메서드에 실행을 원하는 메서드를 작성하여 저장한다.

 

1.  이제 cmd창을 열고, 실행하고자하는 java파일이 저장되어 있는 경로로 이동!

최상위 경로로 이동

최상위 경로로 이동 (필요에 따라 ../../../ 이렇게 더 이동해도 되지만 그럴일은 거의 없을 것 같다)

② 이제 정확히 java 파일이 저장되어 있는 경로로 이동해준다.

2.  java 파일 컴파일 해주기!

원하는 자바파일을 javac을 이용해서 컴파일 시켜준다. 

Java 컴파일은 Java Compiler에 의해 .java 파일을 .class 라는 Java bytecode로 만드는 과정이다. Java Compiler는 JDK를 설치하면 javac.exe 라는 실행 파일 형태로 설치한다. 그래서 javac 명령어를 사용하면 .class 파일을 생성하는 것이다.

javac 을 알아보기전에, JVM (Java Virtual Machine),  JRE (Java Runtime Environment), JDK (Java Development Kit) 에 대해 알고 있으면 좋은데, 자세한 설명은 아래쪽에 두겠다.


<컴파일 과정에서 발생할 수 있는 에러 2 가지>

오류 #1 > 기본 클래스 ThumbAdd.java을(를) 찾거나 로드할 수 없습니다.

classpath 환경변수에 설치한 JDK bin 경로를 추가해줘야한다. 

제어판 - 시스템 - 정보 - (관련설정) 고급 시스템 설정

환경변수에서 Path 를 더블클릭 -> 본인의 JDK bin 경로를 '새로 만들기' 를 이용하여 추가해준다.

Path 를 잘못 지정해둘 경우, JVM에서는 해당 경로만을 탐색하기 때문에 아무리 cmd창에서 java파일의 위치로 이동해도 JVM의 탐색 대상에 포함되어있지 않아 JVM에 찾지 못한다고 나온다. 

추가해주고 cmd 창을 껐다가 다시 켜고 다시 javac 을 실행해야 한다.

오류 #2 > encoding 문제

javac이 친절하게 사용할 수 있는 옵션들을 알려주는데, cmd창에서 javac만 입력해서 엔터치면 친절히 알려준다

여기서 우리는 -encoding 을 사용하면 된다!

이렇게!!! 그러면 에러없이 실행이 됬을 것이다. 어떻게 확인하냐구?  .class 파일이 생긴 것을 확인하면 성공한거다.

오류 참고 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=en3824&logNo=221295260314


3.  java 명령어로 생성된 .class 파일을 실행하자

 

이렇게 실행하면 끄읏

 


JVM (Java Virtual Machine)

- JAVA를 실행하기 위한 가상 기계 

- JAVA는 OS에 종속적이지 않아 JAVA 와 OS 사이에서 중개자 역할을 수행하여 JAVA가 OS 에 종속받지 않고 실행할 수 있게  해준다. JAVA 소스코드 (*.java)는 CPU가 인식하지 못하기때문에 기계어로 컴파일을 해줘야한다. 하지만, JAVA는 JVM이라는 가상머신을 거쳐서 OS에 도달하기 때문에 JVM이 인식할 수 있는 Java bytecode (*.class) 로 변환된다. 

JVM 구성 요소

JRE (Java Runtime Environment)

- JVM이 자바 프로그램을 실행할 때 필요한 라이브러리 파일들과 기타 파일을 가지고 있다.

- JRE는 JVM의 실행환경을 구현한다고 할 수 있다.

- 자바 프로그램을 실행시키기 위해선  JRE를 반드시 설치해야하는데 자바 프로그래밍을 위해선 JDK 가 필요하다.

 

JDK (Java Development Kit)

- JAVA를 사용하기 위해 필요한 모든 기능을 갖춘 키트이다.

- JDK는 JRE를 포함하고 있다. 뿐만 아니라, 컴파일러(javac)와 JDB (Java Debugger), javadoc 를 포함하고 있다.

- 프로그램을 생성, 실행, 컴파일 할 수 있다.

한마디로,
JDK는, 자바를 실행, 컴파일 개발, JRE ·JVM 을 모두 포함하는 포괄적 키드.
JRE 는, 자바 프로그램을 실행할 수 있게 하는 도구, JVM 을 포함함

 

※ 참고: 

https://lee-automation-lab.tistory.com/entry/JAVA-JVM-JDK-JRE-%EB%8A%94-java%EC%99%80-javac-%EA%B9%8C%EC%A7%80-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80

 

[JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...)

JVM이란 무엇인가 Java Virtual Machine의 줄임말. 직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'라고 할 수 있다. Java 는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되

doozi0316.tistory.com

 

반응형

 

반응형
반응형

Controller에서 List형태로 주소값에 보내줄 때, 이 list의 길이를 EL을 이용해서 뿌려주고 싶을때,

나는 이걸 몰랐을, Controller를 이용해서 list.size()해서 다시한번 modelAndView로 보내줬다. 하지만, 그런경우에는 쿼리를 반복해야하고 또한 보내는 수가 늘어나기때문에 데이터의 수가 많아지면 로딩하는데 오래 걸릴 수 있다. 그래서 jstl을 이용한 방법!!! 

(다른 블로그에서 fn.length(list) 를 이용해서 하시던데.... 그건 나에겐 되지않았다. fn라이브러리가 있었는데도 불구하고)

아주 간단하다!!!! list로 받아온거.size() 해주면 자바에서 받아오는 것처럼 사용할 수 있다!!! 완전 편함

반응형
반응형

Java에는 Collection 인터페이스와 Map 인터페이스가 존재한다. 이 인터페이스들은 기본적으로 가지고 있는 메서드 들이 존재하는데 자세한 사항들은 블로그 https://gangnam-americano.tistory.com/41 를 참조하기 바란다!!!

그 중에 이제까지 용이하게 사용했던 것은, contains 라는 메서드이다. 어떠한 값을 가지고있는지를 확인해서 boolean 형태로 값을 return 해주는 메서드다. List 객체에서만 전에 사용했었는데, 이번에 HashMap 을 사용하다가 특정한 Key 를 가지고 있는지 확인하는 방법을 알고 싶어 검색했더니, 아주 쉽게 있었다!!!!

HashMap 객체로 받아오는 updateInfo에 contiansKey("원하는Key") 를 실행하면 boolean으로 나와준다. 

이거와 마찬가지로 값도 가능하다.

항상 ctrl + 스페이스바 를 눌러 확인해보는걸 잊지말자!!! 그렇다면 구글링해서 찾아보지 않아도 됬을텐데....

반응형

+ Recent posts