나아가는 길에 발자국을 찍어보자

JwtAuthenticationResponse 와 ResponseEntity 본문

Spring && Spring boot

JwtAuthenticationResponse 와 ResponseEntity

NAWIN 2020. 7. 21. 10:39
반응형
 @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 특징
    1. self-contained(자가수용적) : JWT 자체적으로 필요한 모든 정보를 포함. 헤더 정보와, 실제 전달할 데이터, 검증 할 수있는 서명 데이터를 모두 포함한고 있다.
    2. 신뢰할수 있다. :디지철 서명에 의해 검증할수있으며 신뢰 할 수 있다. 비밀 값을 사용하는 HMAC알고리즘이나 RDS or ECDSA와 같은 공개키,개인키 쌍으로 서명 된다.
  • 사용 이유
    1. 보안 이슈: 사용자가 자신의 비밀 값으로 서버에 로그인 하게 되면, 서버는 JWT를 리턴한다. token을 인증 값으로 사용하게 되면 기존 쿠키/세션을 사용하는 방식보다 많은 보안 이슈를 막을 수 있다. 서버는 GUI로부터 받은 JWT가 유효할 경우, resouce를 사용하도록 허용한다. 또한 JWT는 쿠키를 사용하지 않기 때문에, Cross-Origin Resource Sharing (CORS) 이슈가 발생하지 않는다.
    2. 데이터 용량: JWT는 기존의 XML보다 덜 복잡하고 인코딩 된 사이즈가 작습니다. 따라서 HTTP와 HTML 환경에서 사용하기 좋다.
    3. 사용성: 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를 보낸 사람이 신뢰할수있는 대상이라는 것을 알 수 있다.

 

 

 

JWT(Json Web Token) 소개

본 포스팅은 크게 3가지 파트로 이루어집니다.

medium.com

 

JSON Web Token (JWT)

may_act Authorized Actor - the party that is authorized to become the actor [IESG] [RFC8693, Section 4.4]

www.iana.org

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

 

 


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가 생성된다.

  • 참고

 

 

 

반응형
Comments