🔥스파르타 TIL (Spring)

인증(Authentication)과 인가(Authorization) 란?

승승장규 2025. 2. 9. 23:15

인증 ▼

  • 해당 유저가 실제 유저인지 인증하는 개념
  • 지문인식, 로그인 등 실제 유저가 맞는지 확인하는 장치

인가 ▼

  • 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념
  • 관리자 페이지, 관리자 권한 

클라이언트 - 서버 ▼

  • HTTP 프로토콜로 통신을 한다.
  • 리소스를 절약하기 위해서 서버와 클라이언트가 연결되어 있지 않는 비연결성으로 이루어져 있다.
  • 서버가 클라이언트의 상태를 저장하지 않는 무상태로 이루어져 있다.

 

 

이러한 환경에서 유저가 인증되었다는 정보를 유지시키기 위해서 어떻게 해야 할까?

 

 

쿠키와 세션 인증 ▼

  • 사용자가 로그인을 하면 DB에서 데이터를 확인하고 결과를 세션 저장소에 해당 유저가 로그인되었다는 정보를 저장한다.
  • 세션 저장소에서는 Session ID를 발급하고 전달하면 브라우저에서는 Session ID를 쿠키에 저장한다. 
  • 사용자는 HTTP Header에 해당 Session ID의 정보를 담아서 서버로 요청한다.
  • 세션 저장소에 있는 정보와 비교해서 응답을 처리해 준다.

 

쿠키를 생성하고 저장하는 코드

    public String createCookie(HttpServletResponse res) {
        addCookie("Robbie Auth", res); // 쿠키에는 공백이 있으면 오류

        return "createCookie";
    }
// 쿠키는 범용적으로 사용 가능하기 때문에 static
    public static void addCookie(String cookieValue, HttpServletResponse response) {
        try {
            // Cookie Value 에는 공백이 불가능해서 encoding 진행
            cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20");
            // URLEncoder을 사용해서 공백을 처리할 수 있음.
            Cookie cookie = new Cookie("쿠키 이름", cookieValue); // 키-값
            cookie.setPath("/");
            cookie.setMaxAge(30 * 60); // 만료 기한

            // Response 객체에 Cookie 추가하여 브라우저에 반환하면 브라우저의 쿠키 저장소에 저장됨.
            response.addCookie(cookie); // 응답 헤더에 set-cookie로 담김.
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
    // @CookieValue는 "쿠키 이름"이라고 되어있는 이름의 쿠키값을 가져온다.
    public String getCookie(@CookieValue("쿠키 이름") String value) {
        System.out.println("value = " + value);

        return "getCookie : " + value;
    }

 

 

세션을 생성하고 가져오는 코드

    public String createSession(HttpServletRequest request) {
        // 세션이 존재할 경우 세션 반환, 없을 경우 새로운 세션을 생성한 후 반환
        HttpSession session = request.getSession(true);

        // 세션에 저장될 정보 키-값 를 추가
        session.setAttribute("세션 이름", "AUTH"); // JSESSIONID 라는 이름으로 유일무이한 세션을 만들어줌

        return "createSession";
    }
    public String getSession(HttpServletRequest request) {
        // 세션이 존재할 경우 세션 반환, 없을 경우 null 반환
        HttpSession session = request.getSession(false);

        String value = (String) session.getAttribute("세션 이름"); // 가져온 세션에 저장된 키-값 을 사용해서 가져옴
        System.out.println("value = " + value);

        return "getSession : " + value;
    }

 


 

JWT 기반 인증 ▼

  • JSON 포맷을 이용해서 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token이다.
  • 쿠키 저장소를 사용해서 JWT를 저장한다.
  • 사용자 로그인 정보가 확인이 되면 암호화된 Access Token으로 응답을 처리한다.
  • 로그인 정보를 Client에 JWT로 암호화해서 저장하고, 모든 서버에서 동일한 Secret Key를 소유한다.
  • API 요청이 들어올 때마다 서버에서는 쿠키에 포함된 JWT를 찾아서 사용한다.

Header ▼

{
  "alg": "HS256",
  "typ": "JWT"
}


Payload ▼

{
  "sub": "123",
  "username": "이름",
  "iat": 1234556,
  "admin": "true
  ....
}


Signature ▼

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

 

 

 

 

지금은 JWT에 대한 간단한 구조만 알아보고

다음 TIL에서 자세한 내용을 다뤄보자 🖐️🖐️

'🔥스파르타 TIL (Spring)' 카테고리의 다른 글

필터(Filter) 란?  (0) 2025.02.10
JWT 활용하기 (1)  (1) 2025.02.10
Bean 이란?  (0) 2025.02.09
JPA 란? (2) - Spring Data JPA  (0) 2025.02.08
JPA 란? (1)  (0) 2025.02.08