Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

스파르타 부트캠프 SpringBoot JWT인증, 인가 본문

Spring

스파르타 부트캠프 SpringBoot JWT인증, 인가

H.S-Backend 2024. 6. 5. 16:36

JWT(Json Web Token)란

JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim기반 WebToken이다.

토큰의 한 종류라고 생각하면된다.

쿠키저장소를 사용하여 JWT를 저장한다.

 


서버가 1대인 경우에는 

Session1이 모든 Client의 로그인 정보를 소유한다

 


서버가 2대 이상인 경우(대용량 트래픽 처리)

Session마다 다른 Client 로그인 정보를 가지고 올 수 있다.

Client1의 로그인정보가 Servie1에 저장이되있다는 가정하에

Client1은 그런거 모르고 API를 요청한다면

Server2와 Server3에도 API를 요청하게 될 수 있다.

이러한 문제의 해결방법은 

Sticky Session을 이용하여 Client마다 Server에 고정한다.

or

세션 저장소를 따로 생성하여 모든 세션을 저장한다.

 


위와 같은 문제해결을 위하여

세션 저장소(Session Storage)를 생성한 경우

Session Storage가 모든 Client의 로그인 정보를 소유하고 있기에

모든 서버에서 모든 Client의 API요청이 처리가 가능하다.


JWT를 사용하게 되면 

로그인 정보를 Server에 저장하지 않고

Client에 로그인 정보를 JWT로 암호화하여 저장한다.

"JWT를 통하여 인증/인가"

또한 모든 서버에서 동일한 Secret Key를 소유한다.

Secret Key를통한 암호화/ 위조 검증을 한다.(복호화시에만)

 

JWT의 장점으로는

동시접속자가 많을 때 서버 측 부하를 낮춘다.

 

단점은

구현의 복잡도가 증가하고

JWT에 담는 내용이 많아질수록 네트워크 비용이 증가한다.

기 생성된 JWT를 일부만 만료시킬 방법이 없다

Secret Key가 공개되어 있어 JWT 조작이 가능하다.

 


Client가 username, password로 로그인 성공시에

서버에서 로그인정보를 받아 JWT로 암호화를 한다(Secret Key를 사용)

 

JWT 예시

 

서버에서 직접 쿠키를 생성해서 JWT를 담아 Client에 전달한다.

JWT전달 방법은 개발자가 정한다.

Cookie cookie = new Cookie(AUTHORIZATION_HEADER, token); // Name-Value
cookie.setPath("/");

// Response 객체에 Cookie 추가
res.addCookie(cookie);


브라우저에서 쿠키 저장소에 자동으로 JWT가 저장된다.


Client에서 JWT통해 인증하는 방법

서버에서 API 요청을 받을 때마다 쿠키에 포함된 JWT를 찾아서 사용한다.

// HttpServletRequest 에서 Cookie Value : JWT 가져오기
public String getTokenFromRequest(HttpServletRequest req) {
    Cookie[] cookies = req.getCookies();
    if(cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals(AUTHORIZATION_HEADER)) {
                try {
                    return URLDecoder.decode(cookie.getValue(), "UTF-8"); // Encode 되어 넘어간 Value 다시 Decode
                } catch (UnsupportedEncodingException e) {
                    return null;
                }
            }
        }
    }
    return null;
}

쿠키에 담긴 정보가 여러개 일 수 있어서

그 중 이름이 JWT가 담긴 쿠키의 이름과 동일한지 확인하여 JWT를 가져온다

이후 Client가 전달한 JWT위조 여부를 검증한다(Secret Key를 사용한다)

JWT유효기간도 확인

검증이 성공한다면

JWT에서 사용자 정보를 가져와서 확인하고

API를 요청한 Client에게 해당 데이터를 전달한다.

 

결국 세션저장소가 없이 

Secret Key를 쿠키에 같이 전달해줌으로써

Client가 Cookie 저장소에 보관하고 있다가

서버에게 요청을 할 경우

JWT와 Secret Key를 확인 -> 유효기간 확인 -> 데이터처리 이다.

JWT는 누구나 평문으로 복호화가 가능하지만

Secret Key가 없다면 JWT 수정이 불가능하다(Read Only)


JWT 조회 사이트

jwt.io

 

JWT.IO

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

jwt.io

반응형