지난 포스팅에서 다룬 인증과 인가.
그 중 쿠키와 세션은 인증과 인가의 개념으로 웹 애플리케이션에서 사용자의 상태를 관리하는데 사용되는 중요한 메커니즘으로
웹 개발에서 사용자의 상태를 관리하고, 웹 사이트와 사용자 간의 상호작용을 보다 개인화하고 유지하기 위한 기술이다.
쿠키-세션 방식은 결국 서버가 '특정 유저가 로그인 되었다'라는 상태를 저장하는 방식이다.
쿠키(Cookies)
쿠키는 클라이언트 측에 데이터가 저장 될 목적으로 생성한 정보가 담긴 파일로,
웹 서버가 HTTP 응답 헤더를 통해 사용자의 브라우저에 데이터를 전송하고, 브라우저는 이 데이터를 로컬에 작은 파일 형태로 저장한다.
이후 같은 서버에 대한 모든 요청에 이 쿠키 정보를 HTTP 요청 헤더에 포함시켜 서버로 전송하게 된다.
쿠키의 동작 방식을 조금 더 자세히 살펴보면
1. 클라이언트가 페이지를 요청하게 되고
2. 서버에서 쿠키를 생성한 뒤
3. HTTP 헤더에 쿠키를 포함시켜서 응답한다.
4. 응답을 받은 후 브라우저가 종료되어도 쿠키 만료 시간이 살아있다면 사용자 정보를 클라이언트에서 보관하고 있다.
5. 같은 요청을 하게 되면 똑같이 HTTP 헤더에 쿠키를 함께 보내고
6. 서버에서 쿠키를 읽어 만약 이전 상태 정보를 변경 할 필요가 있는 경우에 쿠키를 업데이트하여
변경된 쿠키를 HTTP헤더에 포함시켜서 응답한다.
쿠키의 특징
1. 클라이언트 측 저장 : 데이터가 사용자의 컴퓨터에 저장되어 서버의 부하가 줄어든다.
2. 만료 기간 : 개발자가 쿠키의 만료 기간을 설정할 수 있어, 지정된 시간이 지나면 자동으로 삭제된다.
3. 보안 문제 : 쿠키 데이터는 클라이언트에 저장되기 때문에 변조가 가능하고, 민감한 정보를 저장하기에는 적합하지 않다.
4. 크기 제한 : 대부분의 브라우저에서 쿠키 당 4KB의 크기 제한이 존재한다.
쿠키의 구성요소
→ Name (이름): 쿠키를 구별하는 데 사용되는 키 (중복될 수 없음)
→ Value (값): 쿠키의 값
→ Domain (도메인): 쿠키가 저장된 도메인
→ Path (경로): 쿠키가 사용되는 경로
→ Expires (만료기한): 쿠키의 만료기한 (만료기한 지나면 삭제)
자바에서 쿠키 다루기
1. 쿠키 설정
//Cookie 생성은 범용적으로 사용될 수 있기 때문에 static 메서드로 선언
public static void addCookie(String cookieValue, HttpServletResponse res) {
try {
cookieValue = URLEncoder.encode(cookieValue, "utf-8").replaceAll("\\+", "%20"); // Cookie Value 에는 공백이 불가능해서 encoding 진행
//Cookie에 저장될 Name과 Value를 생성자로 받는 Cookie 객체를 생성
Cookie cookie = new Cookie(AUTHORIZATION_HEADER, cookieValue); // Name-Value
cookie.setPath("/");
cookie.setMaxAge(30 * 60); // Path와 만료시간을 지정
// Response 객체에 Cookie 추가 : HttpServletResponse 객체에 생성한 Cookie 객체를 추가하여 브라우저로 반환
res.addCookie(cookie);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage());
}
}
2. 쿠키 읽기
@GetMapping("/get-cookie")
public String getCookie(@CookieValue(AUTHORIZATION_HEADER) String value) {
System.out.println("value = " + value);
return "getCookie : " + value;
}
파이썬에서 쿠키 다루기(Flask)
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/')
def index():
resp = make_response("Setting a cookie")
resp.set_cookie('username', 'user123')
return resp
@app.route('/getcookie')
def getcookie():
username = request.cookies.get('username')
return 'Username is ' + username
파이썬에서 쿠키 다루기(Django)
1. 쿠키 설정
from django.http import HttpResponse
def set_cookie(request):
response = HttpResponse("Cookie is set")
response.set_cookie('username', 'user123', max_age=3600) # 쿠키 유효 시간을 1시간으로 설정
return response
set_cookie 함수는 사용자의 브라우저에 'username'이라는 이름을 가진 쿠키이고
max_age 파라미터는 쿠키의 만료 시간을 초 단위로 설정한다.
2. 쿠키 읽기
def get_cookie(request):
username = request.COOKIES.get('username', 'DefaultUser')
return HttpResponse(f"Username is {username}")
요청에서 'username' 쿠키를 읽어 반환하는데 만약 쿠키가 존재하지 않는다면 기본값인 DefalutUser를 반환하게 된다.
세션(Sessions)
일정시간 동안 클라이언트 상태를 유지하기 위해 사용되는 사용자 정보를 저장하는 방법으로 서버 측에서 데이터를 저장하는 기술이다.
사용자가 웹 사이트에 접속할 때 서버는 유니크한 세션 ID를 생성하여 클라이언트에게 전달하고,
이 ID를 이용해 서버에 저장된 사용자 정보를 관리하게 되며 사용자가 로그아웃하거나 일정 시간 동안 활동이 없을 경우 세션은 만료된다.
서버에서 클라이언트 별로 유일무이한 '세션 ID' 를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장하고
서버에서 생성한 '세션 ID' 는 클라이언트의 쿠키값('세션 쿠키' 라고 부름)으로 저장되어 클라이언트 식별에 사용하는 것이다.
세션의 동작 방식을 조금 더 자세히 살펴보면
1. 클라이언트가 서버에 접속 시 세션 ID를 서버로부터 발급받고
2. 클라이언트는 세션 ID에 대한 정보를 쿠키를 사용하여 저장하고 보유한다.
3. 서버에 요청이 전달될 때 이 쿠키의 세션 ID를 같이 서버에 전달해서 요청하고
4. 서버는 이 세션 ID를 전달 받고 별다른 작업없이 ID로 세션에 있는 클라이언트 정보를 가져와서 사용한다.
5. 정보를 가지고 서버 요청을 처리한 후에 클라이언트에게 응답해준다.
세션의 특징
1. 서버 측 저장 : 모든 데이터가 서버에 저장되어 사용자의 개인 정보 보호가 강화되어 보안 면에서 쿠키보다 우수하다.
2. 유니크 세션 ID : 각 세션은 유니크한 ID로 구분되며, 이 ID만이 클라이언트와 공유되어 클라이언트의 요구에 맞는 서비스를 제공한다.
3. 시간 제한 : 세션은 설정된 시간 동안만 유지되고, 시간이 지나면 자동으로 만료된다.
자바에서 세션 다루기
1.HttpSession 생성
@GetMapping("/create-session")
public String createSession(HttpServletRequest req) {
// 세션이 존재할 경우 세션 반환, 없을 경우 새로운 세션을 생성한 후 반환
HttpSession session = req.getSession(true);
// 세션에 저장될 정보 Name - Value 를 추가
session.setAttribute(AUTHORIZATION_HEADER, "Robbie Auth");
return "createSession";
}
HttpServletRequest을 사용하여 세션을 생성한다.
HttpServletRequest은 세션 생성 뿐만 아니라 반환이 가능하며 반환된 세션은
브라우저 Cookie 저장소에 ‘JSESSIONID’라는 Name으로 Value에 저장
* Servlet : 유일무이한 '세션 ID'를 간편하게 만들수 있는 HttpSession을 제공
2.HttpSession 읽기
@GetMapping("/get-session")
public String getSession(HttpServletRequest req) {
// 세션이 존재할 경우 세션 반환, 없을 경우 null 반환
HttpSession session = req.getSession(false);
// 가져온 세션에 저장된 Value 를 Name 을 사용해서 가져옴
String value = (String) session.getAttribute(AUTHORIZATION_HEADER);
System.out.println("value = " + value);
return "getSession : " + value;
}
파이썬에서 세션 다루기(Flask)
from flask import Flask, session
app = Flask(__name__)
app.secret_key = 'your_secret_key'
@app.route('/')
def index():
session['username'] = 'user123'
return 'Session set'
@app.route('/getsession')
def getsession():
username = session.get('username', 'Not set')
return 'Username is ' + username
파이썬에서 쿠키 다루기(Django)
1. 세션 설정
def set_session(request):
request.session['username'] = 'user123' # 세션에 'username' 저장
request.session.set_expiry(300) # 세션 만료 시간을 300초(5분)로 설정
return HttpResponse("Session is set")
2. 세션 읽기
def get_session(request):
username = request.session.get('username', 'No User')
return HttpResponse(f"Username is {username}")
쿠키(Cookies)와 세션(Sessions)
'💻BackEnd > ⚫Web Security' 카테고리의 다른 글
[Web Security] 인증과 인가 (0) | 2024.05.05 |
---|