애플리케이션에서 사용자의 권한을 구분하는 것은 중요한 보안 기능입니다. 특히, ADMIN과 USER와 같은 권한을 나누는 이유는, 각 사용자가 접근할 수 있는 리소스를 제한하려고 한다. 관리자는 모든 데이터에 접근할 수 있지만 일반 사용자는 제한된 기능만 사용해야 할 필요가 있습니다. 이때 Spring Security를 사용하여 사용자 인증 시 적절한 권한을 부여하고, 이를 세션에 저장하여 각 페이지에서 해당 권한에 맞는 행동을 제어할 수 있다. 세션에 권한을 저장하는 이유는 사용자가 로그인 후 매번 서버에 요청할 때마다 권한을 재확인할 필요 없이, 세션에 저장된 정보를 활용하여 빠르고 효율적으로 권한을 판단하고, 적절한 리소스만 접근하도록 하기 위함이다. 이번 글에서는 DB에서 저장된 권한 코드(aut..
https://ekeprl.tistory.com/40 Spring Security (5) : 비밀번호 암호화 저장기존 코드는 회원가입을 진행할 때 따로 비밀번호 암호화를 진행하지않았다.혹시 데이터가 유출이 된다 하더라고 데이터의 정확한 정보를 넘기지 않기위해 비밀번호 암호화는 필수적이다.따라ekeprl.tistory.com비밀번호를 암호화하여 저장을 완료했고,이번 포스팅은 로그인시 입력한 비밀번호와 비교하여 로그인하는 과정을 작성하겠다. AuthenticationProvider 작성 : https://ekeprl.tistory.com/31 Spring Security (2)(1)편에 이어서 2편을 작성하려한다.2편은 AuthenticationProvider / Success,Failuer Handle..
기존 코드는 회원가입을 진행할 때 따로 비밀번호 암호화를 진행하지않았다.혹시 데이터가 유출이 된다 하더라고 데이터의 정확한 정보를 넘기지 않기위해 비밀번호 암호화는 필수적이다.따라서 이번 포스팅은 회원가입 시 비밀번호를 암호화해서 저장하는것을 작성하려한다. 로그인창에서 회원가입을 누르고 회원가입 화면으로 진입한다.회원가입 기능 : https://ekeprl.tistory.com/26 회원가입(Join) 기능 추가 -2아이디 중복체크를 끝낸 후,아래 초록백 회원가입 버튼을 클릭하고 회원가입기능을 마무리 하려한다. 1)join.jsvar JoinJsFun = { initHtml : function () { join_duplicateBtn.addEventListener("click", function(){ ..
먼저 Session이란클라이언트별로 서버에 유지되는 저장공간이다. *작성자는 소스를 작성할때 사용자를 식별할때 주로 사용한다.* 이전 포스팅에서 게시판목록을 조회할 때Service단에서fun adminBoardSelectList(param : SearchModel) : JSONObject { val jsono = JSONObject() try { val listdata = mapper.adminBoardSelectList(param, session.getAttribute("userid").toString()) jsono["RESULT"] = "OK" jsono["LIST"] = listdata jsono["MESSAGE"] = "조회에 성공하였..
3편은 Provider에서 인증 성공 / 실패 판단을하고 그 후 처리를 어떻게할지 Custom한Success , Failuer Handler에 대해 작성하려한다. 1) SuccessHandler2편에서 작성한 Provider을보면if(user?.userpw.equals(userpw)) { val authorities = listOf(SimpleGrantedAuthority("ROLE_USER")) return UsernamePasswordAuthenticationToken(userid,userpw,authorities)}해당 ID의 PW값과 입력한PW값을 비교해 일치하면 UsernamePasswordAuthenticationToken을 반환하고, 인증이 성공한것으로 간주되어 SuccessHan..
Spring boot : 3.1Spring Security6Kotlin Spring security의 방식에 대해선 다루지않고, 어떻게 작성했는지를 다루도록 하려한다. 1. Build.gradle.ktsdependencies { //spring-secutiry (보안) implementation("org.springframework.boot:spring-boot-starter-security")}의존성 추가를해주고 2.SecurityConfig.kt - FilterChain@Bean@Throws(Exception::class)fun filterChain(http:HttpSecurity) : SecurityFilterChain{ return http.csrf { obj:..
스케쥴이란? @Scheduled 어노테이션을 사용하여원하는 시간/날짜/요일을 지정해 특정 작업을 실행시킬수 있는 방법이다. @Scheduled(cron = "0 0 3 * * *", zone = "Asia/Seoul")해당 소스를 살펴보면zone은 해당 시간이 적용될 장소를 뜻한다. cron = " 1 2 3 4 5 6 " 각 자리의 의미를 알아보면, 1 : 초 (0~59초)2 : 분 (0 ~59분)3 : 시 (0 ~ 23시)4 : 일 (1~31일)5 : 월 (1~12월)6 : 요일 (월~일) **1=월/2=화/3=수/4=목/5=금/6=토/7=일** 위의 코드는 새벽 3시 0분 0초에 원하는 작업을 실행하도록 작성한 것이다. !! 스케쥴에서 사용하는 기호들은 !!* : 모든 값? : 설정 없음 (일,..
코딩을 하면 다양한 오류가 발생한다.모든 오류를 일어나기전에 잡을 수는 없지만,예상치 못한 입력에도 프로그래밍의 기능을 보장할 수 있도록 하는것이 방어적 프로그래밍이다. 몇일사이 업무를 처리하며 미처 생각치못한 두가지의 방어적 프로그래밍을 포스팅하려고한다. 1. NULL체크2. 길이체크 **코드**fun test() { val list = data.List; if(list.length > 0) { todo(); }}list라는 변수는 data(가상의 Json 형식 데이터) 안에 들어있는 List를 담는다고할때,data.List는 값을 갖고있을수도, 없을수도있다. 해당 test코드는 적어도 데이터가 들어있으면todo();라는 함수를 실행시키도록하는 간단한 방어적 프로그..