인증 ▼
- 해당 유저가 실제 유저인지 인증하는 개념
- 지문인식, 로그인 등 실제 유저가 맞는지 확인하는 장치
인가 ▼
- 해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념
- 관리자 페이지, 관리자 권한
클라이언트 - 서버 ▼
- 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 |