일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- BOJ
- social distancing
- 반응형 웹
- 모바일 버전만들기
- 백준
- 백준 BOJ
- Catholic univ Computer Programming Contest
- 텐서플로맛
- 18881번
- 백준 18877번
- spring boot
- 18877번
- JavaScript
- 백준 Social Distancing II
- BOJ Social Distancing
- 베리어블 폰트
- VUE
- java
- CSS
- await
- Social Distancing II
- vue.js
- BOJ 18881
- CCPC
- Spring Security
- BOJ 18877
- 일해라 개발자
- BOJ Social Distancing II
- 18877번 Social Distancing
- async
- Today
- Total
나아가는 길에 발자국을 찍어보자
JwtAuthenticationResponse 와 ResponseEntity 본문
@PostMapping("/login")
public ResponseEntity<JwtAuthenticationResponse> authenticateUser(@Valid @RequestBody LoginDto loginDto) {
System.out.println("받아온 아디랑 비밀번호 : "+loginDto.getUserId() + loginDto.getPassword() );
return ResponseEntity.ok(this.userRegisterService.login(loginDto.getUserId(), loginDto.getPassword()));
}
요 소스 코드를 보고 잘 모르겠는 JwtAuthenticationResponse와 ResponseEntity를 정리해 봤다.
1.JwtAuthenticationResponse
- JWT(Json Web Token) : 정보를 안전하게 전송하기 위해 정의된 공개 표준(RFC 7519)
- JWT 특징
- self-contained(자가수용적) : JWT 자체적으로 필요한 모든 정보를 포함. 헤더 정보와, 실제 전달할 데이터, 검증 할 수있는 서명 데이터를 모두 포함한고 있다.
- 신뢰할수 있다. :디지철 서명에 의해 검증할수있으며 신뢰 할 수 있다. 비밀 값을 사용하는 HMAC알고리즘이나 RDS or ECDSA와 같은 공개키,개인키 쌍으로 서명 된다.
- 사용 이유
- 보안 이슈: 사용자가 자신의 비밀 값으로 서버에 로그인 하게 되면, 서버는 JWT를 리턴한다. token을 인증 값으로 사용하게 되면 기존 쿠키/세션을 사용하는 방식보다 많은 보안 이슈를 막을 수 있다. 서버는 GUI로부터 받은 JWT가 유효할 경우, resouce를 사용하도록 허용한다. 또한 JWT는 쿠키를 사용하지 않기 때문에, Cross-Origin Resource Sharing (CORS) 이슈가 발생하지 않는다.
- 데이터 용량: JWT는 기존의 XML보다 덜 복잡하고 인코딩 된 사이즈가 작습니다. 따라서 HTTP와 HTML 환경에서 사용하기 좋다.
- 사용성: JSON parser는 대부분의 프로그래밍이 지원하기 때문에 XML을 사용하는 SAML 보다 만들기 쉽다.
- 구조
-
3개의 파트가 dot(.)에 의해 구분 된다.
-
XXXX(==header).YYYY(==payload).ZZZZ(==signature)
1) Header
-
token의 type 과 서명에 사용된 알고리즘 으로 구성.
{
"alg" : "HS256",
"typ" : "JWT"
}
2) Payload
-
Claims(클레임)을 포함한다. => Claims : 객체나 추가적인 데이터
-
유형 3가지
1) 등록된 클레임 ( Registered claims )
이미 정의된 클레임들로 무조건 따라야 하는 것은 아니지만 권장하고 있다.대표적인 몇 가지 예를 들자면 iss (issuer, 토큰 발행자), exp (expiration time, 토큰 만료시간), sub (subject, 토큰 제목), aud(audience, 토큰 대상자) 와 같은 클레임들이 있고. 클레임의 이름은 compact를 위해 3글자로 사용하고 있다.
2) 공개된 클레임 ( Public claims )
JWT를 사용하는 사람들에 의해 정의되는 클레임으로, 클레임 충돌을 피하기 위해서 IANA JSON Web Token Registry 에 정의하거나 URI 형식으로 정의해야 한다.
3) 비공개 클레임 ( Private claims )
GUI, 서버, 그 외 모듈간에 협의한 클레임.
- Payload의 예
{
"sub" : "1234567890" ,
"name" : "John Doe" ,
"admin" : true
}
=> 이 데이터가 Base64 인코딩 되어 두 번째 파트에 들어가게 된다..
3) Signature(서명)
- 암호 알고리즘으로 HMAC SHA256 알고리즘을 쓴다고 가정하면 서명을 만들기 위해 아래 공식을 사용한다.
- ex) HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
- 이 서명은 메세지가 중간에 변경되지 않았음을 검증한다. == JWT를 보낸 사람이 신뢰할수있는 대상이라는 것을 알 수 있다.
- 참고
2. ResponseEntity
-
Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스가 존재한다. HTTP요청(Request)또는 응답(Response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스인데, 이 클래스를 상속받아 구현한 클래스가 RequestEntity와 ResponseEntity이다.
-
즉 ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다.(HttpStatus,HttpHeaders,HttpBody를 포함.)
-
Restful API에서 return type으로 사용되고 있는 ResponseEntity.
-
ResponseEntity는 @ResponseBody 어노테이션과 같은 의미로, ResponseEntity를 return type으로 지정하면 JSON(default)또는 Xml Format으로 나타난다.
-
해당 메소드를 통해 작성하면 status -> header -> body 순으로 자동을 작성된다. => http응답에 사용될 데이터 종류 1) Status : ex) ok() ==200응답 데이터 2) Header : header()메소드를 사용 3) Body : body()메소드를 이용하여 body를 작성할수있으며, 매게변수로는 응답할 데이터를 담아준면 된다. body()메소드를 사용하게 되면 ResponseEntity가 생성된다.
-
참고
'Spring && Spring boot' 카테고리의 다른 글
expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:{} 에러 (0) | 2020.08.21 |
---|---|
expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 에러 (0) | 2020.08.21 |
Lombok 라이브러리 (0) | 2020.07.27 |
[Spring-boot + JPA] 댓글 기능 추가하기 (0) | 2020.07.24 |
[Spring Security Architecture] 스프링 시큐리티 아키텍쳐 (0) | 2020.07.21 |